我正在使用下面的代码在我的字符串中添加一些“0”字符,但似乎存在问题并且程序将崩溃。一切似乎都是逻辑但我不知道问题在哪里?
#include <stdlib.h>
#include <string.h>
int main()
{
char *Ten; int i=0; Ten = malloc(12);
Ten="1";
for (i=0;i<10;i++)
strcat(Ten,"0");
printf("%s",Ten);
return 0;
}
答案 0 :(得分:5)
您将Ten
声明为指向字符串文字的指针。但是,您不能依赖于能够修改字符串文字,因此程序崩溃。
要解决此问题,您可以将Ten
声明为数组:
int main()
{
char Ten[12]="1"; int i=0;
for (i=0;i<10;i++)
strcat(Ten,"0");
printf("%s",Ten);
return 0;
}
请注意,您需要12个字节; 11表示字符,1表示终止NUL
字符。
答案 1 :(得分:3)
Ten
是字符串文字,您无法修改它。请尝试使用数组
char Ten[12] = "1";
for (i=0;i<10;i++)
strcat(Ten,"0");
printf("%s",Ten);
请注意我创建了一个12
字符数组,因为应该有终止'\0'
的空间。
你实际上并不需要strcat
,只是这样做
char Ten = malloc(12);
if (Ten != NULL)
{
Ten[0] = '1';
for (i = 1 ; i < 11 ; i++)
Ten[i] = '0';
Ten[11] = '\0';
/* Use Ten here, for example printf it. */
printf("%s",Ten);
/* You should release memory. */
free(Ten);
}
或
char Ten = malloc(12);
if (Ten != NULL)
{
Ten[0] = '1';
memset(Ten + 1, '0', 10);
Ten[11] = '\0';
/* Use Ten here, for example printf it. */
printf("%s",Ten);
/* You should release memory. */
free(Ten);
}
答案 2 :(得分:2)
引用linux上的strcat manual:
strcat()函数将src字符串追加到dest字符串, 覆盖dest末尾的终止空字节('\ 0'),和 然后添加一个终止空字节。字符串可能不重叠,并且 dest字符串必须有足够的空间用于结果。如果dest不是 足够大,程序行为是不可预测的;缓冲区溢出 攻击安全程序的最佳途径。
您的Ten
数组仅足以存储原始文字。只要最终需要的字符串,您需要预先分配内存。
答案 3 :(得分:1)
字符串文字可能存储在内存的只读部分中。任何修改此类文字的尝试都会导致未定义的行为。
要连接两个字符串,目标必须为要添加的字符和'\0'
的空间分配足够的空间。将Ten
的声明更改为
char Ten[12] = "1";
它会起作用。