StrCat不使用Single Char String - C.

时间:2015-01-11 19:51:28

标签: c

我正在使用下面的代码在我的字符串中添加一些“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;
}

4 个答案:

答案 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";  

它会起作用。