使用 malloc 分配的字符串仅返回第一个字符

String allocated with malloc is only returning the first character

提问人:jendeukstan 提问时间:11/1/2022 最后编辑:Vlad from Moscowjendeukstan 更新时间:11/1/2022 访问量:80

问:

我正在编写一个函数来重新排列字符串的字符。我用 malloc 分配了新字符串并对其进行初始化,然后返回它。但是当我返回它时,它总是只返回第一个字符。

我尝试逐个打印新字符串的字符,并且它们正确打印出来,但是当我调用该函数时,只返回第一个字符。我不知道为什么。任何帮助将不胜感激! 这是我的代码:

char * solution(char * s) {
    int len = strlen(s);
    int i;
    int index = 0;
    
    char *ans = (char *) malloc(sizeof(char) * (len + 1));
    if (ans == NULL) {
        fprintf(stderr, "Ran out of space in some function \n");
        exit(1);
    }
    //char* ans = (char *) malloc(len + 1);
    ans[len] = '\0';
    
    for(i = 0; i < len/2; i++){
        ans[index++] = s[i];
        
        ans[index++] = s[len - i];
    }
    if(len % 2 == 1){
        ans[index] = s[len/2];
    }
    return ans;
}

C for 循环 char malloc c-strings

评论


答:

2赞 Vlad from Moscow 11/1/2022 #1

在这个 for 循环的第一次迭代中

for(i = 0; i < len/2; i++){
    ans[index++] = s[i];
    
    ans[index++] = s[len - i];
}

该字符设置为 ( 在循环的第一次迭代中等于 ),即 。ans[1]s[len]i0'\0'

因此,您将得到一个仅包含一个字符的字符串。

你所做的就是你得到的:)

看来你的意思是

ans[index++] = s[len - i - 1];

请注意,由于源字符串在函数中没有更改,因此该函数应声明为

char * solution( const char * s );

原始声明

char * solution(char * s);

表示字符串将就地更改。

如果要更改字符串,则该函数可以按以下方式显示,如下面的演示程序所示。

#include <string.h>
#include <stdio.h>

char * solution( char *s )
{
    size_t n = strlen( s );

    for (size_t i = 1; i < n; i += 2)
    {
        char c = s[n - 1];
        memmove( s + i + 1, s + i, n - i - 1);
        s[i] = c;
    }

    return s;
}

int main( void )
{
    char s[] = "0123456789";
    puts( s );
    puts( solution( s ) );
}

程序输出为

0123456789
0918273645

评论

0赞 jendeukstan 11/2/2022
谢谢!我现在明白了,我学到了一个新功能。
0赞 Vlad from Moscow 11/2/2022
@jendeukstan 好吧,如果问题解决了,那么通过选择最佳答案来关闭您的问题,您的声誉将会增加:)。