C字符串赋值后为空

C string is empty after assignment

我试图解决一个编码问题,使用 C 将整数转换为字符串。例如如果有一个整数 321,那么函数应该 return 一个字符串“321”。根据分配期间的输出,我的角色分配似乎是成功的。但是,一旦分配完成,我的字符串就完全是空的。不知道为什么会这样。我猜它与空终止字符有关?

char * solution(int X) {
   
    printf("x is %d\n", X);
    
     int len = len_num (X);  //Returns correct length as tested.
     printf("Length is %d\n", len);
     
     char * str = (char*)malloc( (++len * sizeof(char)) ); //one extra space for '[=10=]'

     str[len] = '[=10=]';   //Assigning the last character as null terminating character '[=10=]'
     int i = len - 1 ;
     do  
     {   
         int n = X%10;
         str[i] = '0' + n;
         printf("str[%i]:%c, n:%d.\n", i, str[i], n);
         X = X / 10;
         i--;
     }while (i > 0);
   
     printf("\nstr:%s.\n", str);
     return str;
}
Output:
x is 942
Length is 3
str[1]:2, n:2.   <---- All assignments are successful 
str[2]:4, n:4.
str[3]:9, n:9.

str:.            <----This shouldn't be empty!

您有一些差一错误。

第一个在这里:

 char * str = (char*)malloc( (++len * sizeof(char)) ); //one extra space for '[=10=]'

 str[len] = '[=10=]';   //Assigning the last character as null terminating character '[=10=]'

您分配了足够的 space,但是由于 len 递增 str[len] 超出了已分配内存的末尾,写入导致 undefined behavior。你反而想要:

char * str = malloc( len + 1 );

请注意,您不应转换 malloc 的 return 值,并且 sizeof(char) 定义为 1。

与此相关,在循环的底部递减 i 然后检查它是否大于 0。这意味着您永远不会写入数组的元素 0。你想要:

 do  
 {   
     ...
 }while (i >= 0);

对于初学者这个声明

str[len] = '[=10=]';

使用子表达式 ++len.

写入超出在此声明中分配的已分配字符数组
char * str = (char*)malloc( (++len * sizeof(char)) );

所以程序已经有未定义的行为。

也是由于while循环的条件

while (i > 0);

你从未设置数组的元素str[0]

由于函数参数具有带符号的整数类型int,因此用户可以传递负数。你应该正确处理这样的情况。

函数如下面的演示程序所示。

#include <stdio.h>
#include <stdlib.h>

size_t len_num( int x )
{
    const int Base = 10;
    
    size_t n = 0;
    
    do
    {
        ++n;
    } while ( x /= Base );
    
    return n;
}

char * solution( int x ) 
{
    const int Base = 10; 
    size_t len = len_num( x );
    
    int sign = x < 0; 
    if ( sign ) ++len;
     
    char *s = (char * )malloc( len + 1 );

    if ( s )
    {
        s[len] = '[=13=]';
    
        do
        {
            s[--len] = ( sign ? -( x % Base ) : ( x % Base ) ) + '0';
        } while ( x /= Base );
        
        if ( sign ) s[--len] = '-';
    }
    
    return s;
}

int main(void) 
{
    int x = 12345;
    char *s = solution( x );
    
    if ( s ) puts( s );
    
    free( s );
    
    x = -12345;
    
    s = solution( x );
    
    if ( s ) puts( s );
    
    free( s );
    
    return 0;
}

程序输出为

12345
-12345