【问题标题】:Dynamically allocating string of uknown length动态分配未知长度的字符串
【发布时间】:2019-11-21 18:31:07
【问题描述】:

我正在尝试分配长度未知的字符串。我已经制作了这个程序,它工作正常,但是当我尝试 valgrind 时,它总是显示 1 错误“条件跳转或移动取决于未初始化的值” 程序看起来像这样

char *text = NULL;
int i = 0, error = 0;
text = (*char) malloc(sizeof(char));
while(1){
   error = scanf("%c", &text[i]);
   if(error == EOF)
      break;
   i++;
   text = (*char) realloc(text, sizeof(char) * (i + 1));
}
printf("%s", text);
free(text);

我尝试过使用

scanf("%ms", &text);

但这会停止,当出现换行符时,这是我的任务中的一个问题。 有什么建议吗?

【问题讨论】:

  • (*char) 应该是 (char*)。但是dont cast malloc
  • 您展示的代码有一个主要问题:您忘记了字符串需要以空值终止。您需要分配一个额外的字符,在打印字符串之前,您需要将其初始化为'\0'
  • 另外,请花一些时间阅读how to ask good questionsthis question checklist。并学习如何创建minimal reproducible example 向我们展示。您向我们展示“类似”您拥有的代码是不够的,最好向我们展示一个正确的示例,它可以复制您所询问的问题,并且不包含任何其他不相关的错误。
  • 这种“尝试将字符串塞入缓冲区,如果不起作用,将长度增加一个并重试”的方法确实效率低下。尝试将缓冲区的大小增加一倍,或者每轮增加 1.5 倍。
  • 关于换行符,您显示的代码不应在换行符处停止。它会从标准输入读取输入,直到您实际输入“文件结尾”(例如,在 Linux 或 macOS 等 POSIX 系统上为 Ctrl-D,在 Windows 上为空行上的 Ctrl-Z)。

标签: c


【解决方案1】:

将显式循环写入 getchar/realloc 的替代方法:

scanf 将一直读取到一个空格。使用标准库调用执行多行读取的替代方法很少。更少的行/更少的错误。

使用 getdelim,带有 0 delim。只要输入没有 NUL 字符就可以工作。

    char *cp = NULL ;
    size_t n = 0 ;
    getdelim(&cp, &n, 0, stdin) ;
    printf("S=%s\n", cp) ;

如果 getdelim 不可用,则可以使用有效接受所有字符的字符序列。使用将拒绝不会在输入中显示的字符的字符序列(例如,Ctrl/A、'\001')。

    char *cp = NULL ;
    fscanf("%m[^\1]", &cp) ;
    printf("S=%s\n", cp) ;

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2015-04-27
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多