在C中获取字符串输入的这两种方法有什么区别?

时间:2016-01-04 02:51:16

标签: c string memory-management realloc

我正在学习C编程,我必须实现一个读取未知大小的输入字符串的程序。 我写了这段代码:

Queen

但是最后一个int main() { char *string; char c; int size = 1; string = (char*)malloc(sizeof(char)); if (string == NULL) { printf("Error.\n"); return -1; } printf("Enter a string:"); while ((c = getchar()) != '\n') { *string = c; string = (char*)realloc(string, sizeof(char) * (size + 1)); size++; } string[size - 1] = '\0'; printf("Input string: %s\n", string); free(string); return 0; } 没有显示整个字符串,只显示了最后一个字符。 因此,如果我输入printf最后hello, world次打印printf

经过一番研究后,我尝试了this代码并且它有效!但我并没有与我的不同。

我希望自己清楚明白,谢谢你的关注。

4 个答案:

答案 0 :(得分:5)

在您的代码版本中,您使用以下内容将新读取的字符c分配给string

*string = c;

*string指向字符串的开头,这样你就可以用新读取的字符替换字符串的第一个字符。

您链接的代码执行以下操作:

str[i] = c

基本上,它使用索引i将字符分配给字符串的末尾。

在您的代码版本中,您可以使用size - 1代替i

答案 1 :(得分:3)

尝试更改:

*string = c;

要:

string[size-1] = c;

这样你就不会每次都覆盖第一个角色。

答案 2 :(得分:3)

您的代码存在一些问题:

  • 将所有字符存储到已分配内存的第一个字节
  • 您将字符读入char变量,无法正确测试EOF
  • 您将运行无限循环,分配所有可用内存,如果标准输入不包含'\n',则最终崩溃,例如从空文件重定向。
  • 不太重要,你为每个字节读取重新分配缓冲区,效率低,但可以在以后进行优化。

以下是更正后的版本:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *string;
    int c;
    int len = 0;

    string = malloc(1);
    if (string == NULL) {
         printf("Error.\n");
         return -1;
    }
    printf("Enter a string:");
    while ((c = getchar()) != EOF && c != '\n') {
        string[len++] = c;
        string = realloc(string, len + 1);
        if (string == NULL) {
            printf("cannot allocate %d bytes\n", len + 1);
            return -1;
        }
    }
    string[len] = '\0';

    printf("Input string: %s\n", string);
    free(string);
    return 0;
}

关于与链接代码的区别的问题,它使用相同的方法,少了一个bug,还有一个bug:

  • 它将字符存储在str
  • 中的适当偏移量中
  • 如果输入文件不包含'\n',则会运行无限循环,与您的相同。
  • 它会调用未定义的行为,因为c未针对第一次测试进行初始化。

答案 3 :(得分:1)

*(string + size - 1) = c;

也许这有帮助