【问题标题】:Concatenating a char into a string将一个字符连接成一个字符串
【发布时间】: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


【解决方案1】:

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】:
    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;
    }
    

    【讨论】:

      【解决方案3】:

      好的,解决办法就到这里

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

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

      P.S - 如果你可以访问 gdb,你可以实际检查一下..

      【讨论】:

      • 谢谢,伙计!这对我理解很多字符串函数的工作原理很有帮助!
      猜你喜欢
      • 2012-02-02
      • 2022-12-17
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2014-03-15
      • 2015-06-18
      • 2017-10-25
      相关资源
      最近更新 更多