【发布时间】:2013-05-15 05:50:44
【问题描述】:
我正在尝试从控制台读取字符串。但我想逐个字符地阅读它。而且我在将字符连接到字符串和打破循环时遇到了麻烦。 代码如下:
char* createString(){
char c;
char *string;
int x=0;
string = (char*) calloc(1, sizeof(char));
do{
c = getche();
if(c != '\n'){
x++;
realloc(string, sizeof(char)*x);
strcat(string, &c);
};
}while(c != '\n');
return string;
};
当我运行此代码时,每个连接添加 3 个字符,而不仅仅是 1。这就像访问未分配的内存...(例如,如果我按 a,则最终字符串是 a%T。然后,如果我按下另一个键,例如s,则字符串变为a%Ts%T)
当我按下Enter 时,它会进入 if 并且不会退出循环。
我不知道为什么以及发生了什么......
编辑
基于到目前为止的其他尝试和响应,我更改了代码,现在是这样的:
char* digitarString(){
char c[2];
char *string;
string = (char*) calloc(1, sizeof(char));
do{
c[0] = getche();
c[1] = '\0';
if(c[0] != '\n'){
strcat(string, c);
};
}while(c[0] != '\n');
return string;
};
但是,还有两个问题……
- 代码有效,但我认为它是在未分配的内存中写入的。
- 当我按
Enter时,它仍然不起作用。它不断进入循环和if。
忘记Enter...我改了...
c[0] = getche();
到
scanf("%c", &c[0]);
而且工作得非常好。
【问题讨论】:
-
strcat期望指向以 0 结尾的chars 数组的指针。你没有通过那个。 -
恐怕更新的代码是错误的。
strcat不会为您分配内存,因此您将无限量的数据写入 1 字节数组。我想这对你有用,可能是因为你的程序没有分配任何更多的内存,也没有释放string,所以你永远不会注意到内存损坏。 -
是的,我也害怕。实际上,我认为它真的发生了......你知道有什么方法可以避免这个问题吗?
标签: c string loops char concatenation