5

我正在尝试从控制台读取字符串。但我想逐个字符地阅读它。而且我在将字符连接到字符串和打破循环时遇到了麻烦。这是代码:

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]);

并且工作得非常好。

4

3 回答 3

9

好的,这是解决方案

 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,那么字符串将超过一个字符长并且它最终会将所有这些字符附加到您的原始字符串中,因此是垃圾。

我希望现在很清楚...

PS - 如果您可以访问 gdb,您可以实际检查..

于 2013-05-20T16:39:41.583 回答
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';
于 2013-05-20T15:59:30.930 回答
-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;
}
于 2013-05-20T16:29:14.547 回答