gpt4 book ai didi

将一个字符连接成一个字符串

转载 作者:行者123 更新时间:2023-12-03 15:59:38 26 4
gpt4 key购买 nike

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

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它仍然不起作用。它不断进入循环和如果。

  • 忘记 Enter ……我改了……
    c[0] = getche();


    scanf("%c", &c[0]);

    并且工作得非常好。

    最佳答案

    好的,这是解决方案

     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,您可以实际检查..

    关于将一个字符连接成一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16653458/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com