我试图动态声明一个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;
}
答案 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中的内存分配......
我对我认为你想要的东西进行了一些编辑。修改在来源的评论中解释。如果您有任何疑问,请告诉我。
malloc
答案 1 :(得分:0)
在前两种情况下,您只为单个char
分配足够的空间。如果您尝试向该内存块写入多个内存,则会写入超出为您分配的内存的末尾。这样做会调用undefined behavior,在这种情况下会显示为打印奇怪的字符。
在第三种情况下,您分配x
个字节的内存,但x
未初始化且具有不确定的值。读取不确定的值也是未定义的行为。在这种情况下,它恰好起作用,因为不确定值恰好是一个有效值,并且足够大以容纳您想要的字符串,但是您不能依赖于该行为。
您需要为您需要的每个字符分配一个字节,并为在C中结束字符串的终止空字节加1。
答案 2 :(得分:0)
注意第一次分配,这一次
str = malloc(sizeof(char));
完全等同于 1
str = malloc(1);
所以除了一个问题之外,你没有空间,因为它只代表一个空字符串。
如果分配这么多空间,很可能会从分配的空间中访问内存,从而导致 undefined 和不可预测的行为。您需要了解c中的字符串是什么,
根据 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
- 是相同的 - 非常重要。
c标准库中期望字符串参数的所有函数都期望存在 null 终结符。例如strlen()
将对字符进行计数,直到达到'\0'
为止,如果它不存在,那么您无法预测它将停止计数的位置,这会导致 undefined行为
1 sizeof(char)
由c标准定义,总是等于一。