gpt4 book ai didi

c - 读取一行时 c 中的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:46:26 25 4
gpt4 key购买 nike

我想读取用户输入(如终端)直到写入退出或 ctrl+c/ctrl+d 被按下。我阅读每一行(直到按下回车/回车),检查它是否只是空格或注释 (#),然后执行一些功能。

我尝试了三种方法,但都没有成功。每次插入字符串并按回车键时都会出错

char line[256];
while(printf("%s>", shell_name) && scanf("%50[^\n]", line) != EOF)
{

段错误(核心转储)

while(printf("%s>", shell_name) && getline(line, 100, stdin) != EOF)

注意:需要‘size_t * restrict’但参数是‘int’类型

while(printf("%s>", shell_name) && fgets(line, sizeof(line), stdin) != NULL)
{

段错误(核心转储)

为了获得更多的指导,我接下来会做这个

if(isspace(&line) == 0 && &line[0] != "#")

我做错了什么?有没有更合适/更容易/更好的选择?

最佳答案

可能会出现段错误,因为您进入了无限循环:scanf("%50[^\n]", line) 读取您的输入并在返回处停止。 Return 不会被消耗并保留在输入缓冲区中。那么下次会发生什么? scanf 检查输入缓冲区,嘿!有返回!所以它停止阅读。等等。

scanf 格式字符串中添加一个空格作为第一个字符可以解决:

int main()
{
char line[256];
char *shell_name = "mysh";

while (printf("%s>", shell_name) && scanf(" %50[^\n]", line) != EOF)
{
printf ("you entered [%s]\n", line);
}
printf ("done.\n");
return 0;
}

进一步说明,这是错误的:

if(isspace(&line) == 0 && &line[0] != "#")

-- gcc 提示

warning: passing argument 1 of 'isspace' makes integer from pointer without a cast
warning: comparison with string literal results in unspecified behavior

第一个在 isspace(&line) 上,您可能指的是 isspace(line[0]),第二个在 &line[0] != "#",可以更简洁地写成 line[0] != '#'


getline

getline 与其他“从标准输入获取”函数的工作方式不同,因为它会在需要时自动分配内存。由于它需要返回的不是一个,而是三个 结果(字符数、输入的字符串及其长度),因此您需要为字符串和大小参数提供指针 :

size_t line_size = 0;
char *ptr_to_line = NULL;

while (printf("%s>", shell_name) && getline(&ptr_to_line, &line_size, stdin) != -1)
...

使用这种方式时,不应使用静态字符串大小分配,因为函数会填充适当的值。 (但不要忘记它在内部使用 mallocrealloc,因此请确保 free 结果。它使用 malloc 第一次,realloc 之后调整大小。)

关于c - 读取一行时 c 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23979283/

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