我正在尝试从控制台读取一个字符串。但我想用char读它char。而且我在将字符串连接到字符串AND并且打破循环时遇到了麻烦。 这是代码:
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
,最后一个字符串是{{ 1}}。然后,如果我按另一个键,例如a%T
,则字符串变为s
)
当我按下a%Ts%T
时,它会进入if并且不会离开循环。
我不知道为什么以及发生了什么......
基于到目前为止的其他尝试和响应,我更改了我的代码,现在它就像这样:
Enter
但仍有两个问题......
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
......我改变了它......
Enter
到
c[0] = getche();
并且工作得非常好。
答案 0 :(得分:6)
好的,这是解决方案
strcat(string, &c);
将此更改为
strncat(string, &c,1);
现在回答问题的原因是什么?
首先,请致电以下声明c = getche();
将为我们扫描一个值,并将其放在名为c
的变量中现在让我们考虑将变量放在任意内存位置x
c
+-----------+------------+------------+-----------+------------+------------+
| a | | | | | |
+---------- +---------- +---------- +---------- +--------- - +---------- +
x = &c x+1 x+2 ......
现在进入下一个重要声明
strcat(string, &c);
上面的第二个参数应该是一个字符串意味着结尾处的NULL终止但是我们不能保证x + 1位置是NULL并且如果x + 1不是NULL那么该字符串将不止一个字符很长,它最终将所有这些字符附加到原始字符串,因此垃圾。
我希望现在很清楚......
P.S - 如果你有权访问gdb,你几乎可以检查..
答案 1 :(得分:0)
1)你应该初始化
int x=1;
2)你应该更新这一行:
realloc(string, sizeof(char)*x);
到
string = realloc(string, sizeof(char)*x);
3)你不需要strcat连接。所以不要使用
strcat(string, &c);
使用以下行
string[x-2] = c;
string[x-1] = '\0';
答案 2 :(得分:-1)
char* createString(void){
int c;
char *string=NULL;
int x=0;
while(1){
c = getche();
string = realloc(string, sizeof(char)*(x+1));
if('\n' != c)//input <ctrl+j> or use getchar()
string[x++] = (char)c;
else {
string[x] = '\0';
break;
}
}
return string;
}