将char连接成字符串

时间:2013-05-20 15:57:16

标签: c string loops char concatenation

我正在尝试从控制台读取一个字符串。但我想用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();

并且工作得非常好。

3 个答案:

答案 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;
}