如何在c

时间:2018-06-13 13:34:19

标签: c

我试图动态声明一个char数组,我需要做的是将最新字符添加到字符串中工作正常,问题是当我尝试将其打印出来时,在字符串的开头有一些未知的字符。

char add[2];
char str2[200];
char c;
int temp = -1;
int num = 0;
char *str3;
str3 = malloc( (size_t)count ); //str3 = malloc(sizeof(char)) not working
while((c= getch()) !='\r')
{
    for (int i = 0;i<200;i++)
    {
        if (str2[i] =='\0')
        {
            num = i;
            break;
        }
    }
    //printf("Num: %d\n",num);

    if ((temp == -32) || (temp == 0))
    {
    }
    else
    {
        if(isalnum((char)c) == 0)
        {
            if((c == '\'') || (c == -118) || (c == -115) || (c == -107) || (c == -123) || (c == -105)|| (c == 32))
            {
                realloc(str3,sizeof(char)+2);
                printf("true: %c\n",c);
                //realloc(str2,sizeof(char)+1);
                add[1] = '\0';
                add[0] = c;
                strcat(str3,add);
                strcat(str2,add);
                printf("%s\n",str2);
                printf("%s\n",str3);
            }
            else if (c == 8)
            {
                printf("Deleting something...\n");
            }
        }
        else
        {
            realloc(str3,sizeof(char)+2);
            printf("true: %c\n",c);
            //realloc(str2,sizeof(char)+1);
            add[1] = '\0';
            add[0] = c;
            strcat(str3,add);
            strcat(str2,add);
            printf("%s\n",str2);
            printf("%s\n",str3);
        }
    }
    printf("ASCII Code: %d\n",c);
    temp = c;
}

3 个答案:

答案 0 :(得分:3)

要为字符串获取一些内存,您必须告诉malloc您需要多少字节的内存。 sizeof(char)返回1,因此,您只有1个字节。在C中,字符串由NULL字节(\0)和printf终止,其他字符将打印,直到找到NULL终结符。

如果您这样做:

char *str = malloc(1);
*str = 'a';
printf("%s", str);

您可能会得到一个非常奇怪的输出,因为您没有NULL终止符。

使用unsigned x; str = malloc(x);时,实际上未定义您拥有的字节数,因为x变量未初始化。

由于你的问题很不清楚,我可以告诉你(从你想要的我认为)是如何实际获得63个字符加上{{1}的字符串的空间终止字节。

NULL

那就行了。

另请注意,char *str = malloc(64); strcpy(str, "Stack Overflow"); printf("%s", str); 返回的内存块不会归零,因此您无法知道其中的内容(这可能是您在打印时遇到垃圾的原因)。< / p>

我建议您阅读好的C书或Wikipedia中的内存分配......

编辑完成后,“MCVE”

我对我认为你想要的东西进行了一些编辑。修改在来源的评论中解释。如果您有任何疑问,请告诉我。

malloc

答案 1 :(得分:0)

在前两种情况下,您只为单个char分配足够的空间。如果您尝试向该内存块写入多个内存,则会写入超出为您分配的内存的末尾。这样做会调用undefined behavior,在这种情况下会显示为打印奇怪的字符。

在第三种情况下,您分配x个字节的内存,但x未初始化且具有不确定的值。读取不确定的值也是未定义的行为。在这种情况下,它恰好起作用,因为不确定值恰好是一个有效值,并且足够大以容纳您想要的字符串,但是您不能依赖于该行为。

您需要为您需要的每个字符分配一个字节,并为在C中结束字符串的终止空字节加1。

答案 2 :(得分:0)

注意第一次分配,这一次

str = malloc(sizeof(char));

完全等同于 1

str = malloc(1);

所以除了一个问题之外,你没有空间,因为它只代表一个空字符串。

如果分配这么多空间,很可能会从分配的空间中访问内存,从而导致 undefined 和不可预测的行为。您需要了解中的字符串是什么,

  • 中的字符串是一系列非空字符后跟空字符,因此对于包含N个字符的字符串,您需要N + 1个数组元素(对于ascii,这等于字节)< / em>的

根据 string 的定义,如果你想存储字符串"Hello",你至少需要以下代码

char *str = malloc(6);
if (str != NULL) {
    str[0] = 'H';
    str[1] = 'e';
    str[2] = 'l';
    str[3] = 'l';
    str[4] = 'o';
    str[5] = '\0'; // Or equivalently str[5] = 0;
}

如您所见,最后一个字符'\0'0 - 是相同的 - 非常重要。

标准库中期望字符串参数的所有函数都期望存在 null 终结符。例如strlen()将对字符进行计数,直到达到'\0'为止,如果它不存在,那么您无法预测它将停止计数的位置,这会导致 undefined行为

1 sizeof(char)标准定义,总是等于一。