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
我试图解决一个编码问题,使用 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