将char连接成字符串

Bes*_*ter 2 c string loops concatenation char

我试图从控制台读取一个字符串.但我想用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;
};
Run Code Online (Sandbox Code Playgroud)

当我运行这个代码时,每个连接添加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;
};
Run Code Online (Sandbox Code Playgroud)

但是,还有两个问题......

  • 代码有效,但我认为它是在非分配内存中编写的.
  • 当我按Enter它仍然不起作用.它继续进入循环,如果.

忘了Enter......我改变了......

c[0] = getche();
Run Code Online (Sandbox Code Playgroud)

至

scanf("%c", &c[0]);
Run Code Online (Sandbox Code Playgroud)

并且工作得非常好.

u__*_*u__ 7

好的,这是解决方案

 strcat(string, &c);
Run Code Online (Sandbox Code Playgroud)

将此更改为

strncat(string, &c,1);
Run Code Online (Sandbox Code Playgroud)

现在回答问题的原因是什么?

首先请致电以下声明

c = getche();
Run Code Online (Sandbox Code Playgroud)

将为我们扫描一个值,并将其放在名为c的变量中

现在让我们考虑将变量放在任意内存位置x

    c
+-----------+------------+------------+-----------+------------+------------+
|     a     |            |            |           |            |            |
+---------- +----------  +----------  +---------- +--------- - +---------- +  
  x = &c       x+1             x+2            ......
Run Code Online (Sandbox Code Playgroud)

现在到下一个重要的声明

strcat(string, &c);
Run Code Online (Sandbox Code Playgroud)

上面的第二个参数应该是一个字符串意味着最后的NULL终止,但我们不能保证x + 1位置是NULL,如果x + 1不是NULL,那么字符串将超过一个字符长而且它最终将所有这些字符附加到原始字符串,因此垃圾.

我希望现在很清楚......

PS - 如果你有权访问gdb,你几乎可以检查..