【问题标题】:Can you read in a variable length string from standard input using getchar()您可以使用 getchar() 从标准输入中读取可变长度字符串吗
【发布时间】:2021-11-01 23:34:37
【问题描述】:

我只是在试验,想知道为什么我的尝试没有奏效(程序崩溃)。

#include <stdio.h>
#include <stdlib.h>  
int main(int argc, char **argv)
{
    
    char *list;
    list =  (char*)malloc(sizeof(char));
    char a;
    int i = 0;
    
    while ( (a =getchar()) !='\n'){
        
        list[i]= a;
        list = (char*)realloc(list,sizeof(char));
        ++i;
       
    } 
    
    printf("%s",list);
    free(list);
    
    
    return 0;
}

【问题讨论】:

  • 可以,但要记住两点:首先,C 中的字符串实际上称为 null-terminated 字符串,意思是字符串的x 元素需要x + 1 字符的空间以适应终止符(当然,您需要添加);第二件事是提供给realloc 的大小是new 大小,以字节为单位。不是要添加多少内存。
  • 请注意 getchar() returns an int 并且您应该考虑 EOF 以及换行符:int a; … while ((a = getchar()) != EOF &amp;&amp; a != '\n')。您也应该在printf() 语句中的格式字符串中添加一个换行符。最好避免重复地将缓冲区中分配的空间量增加一——这会变得很昂贵。跟踪分配的数量,从小分配(比如 4 个字节)开始,当您需要更多空间时将大小加倍。输入完成后,您可以释放多余的部分。
  • 感谢您的 cmets
  • Afzel 还有一件事是一个好习惯,我没有将其包含在答案中,因为它没有回答您的直接问题。这总是需要很长时间才能咬我们,到时候我们已经养成了坏习惯。如果在获取更多内存时出现问题,malloc 和 realloc 可以返回 null。所以你永远不应该假设这些命令有效。您不需要在所有代码中添加空检查。每当我想释放时,我都会使用 malloc 和“析构函数”来制作“构造函数”,后者对于链表和嵌套结构特别有用。
  • 不要强制转换 malloc 返回的值:stackoverflow.com/questions/605845/…

标签: c string malloc realloc getchar


【解决方案1】:

sizeof(char) 始终为 1。您需要将其乘以列表的长度。

要跟踪列表的大小,最好使用 size_t 或整数,例如

list = (char*)realloc(list,sizeof(char)*(i+2));

正如@Ian Abbot 在 cmets 中提到的,我们添加 2 而不是 1 为空终止符腾出空间(如下)。

注意:我保留了您的代码风格,但请参阅 cmets 中对您原始问题的建议,不需要此演员表。

在你的循环之后,你还需要一个空终止符。

...

    }
    list[i] = 0;

【讨论】:

  • 由于i 在realloc 之后递增,因此重新分配大小应为i+2,以便为存储在list[i] 的字符和末尾的空终止符留出空间。 (如果您还将i++; 行移到realloc 之前,您的代码就可以了。)
猜你喜欢
  • 2011-02-25
  • 2011-12-02
  • 2011-01-31
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 2021-06-05
  • 2020-04-09
相关资源
最近更新 更多