我想读取用户输入(如终端)直到写入退出或 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)
...
使用这种方式时,不应使用静态字符串大小分配,因为函数会填充适当的值。 (但不要忘记它在内部使用 malloc
和 realloc
,因此请确保 free
结果。它使用 malloc
第一次,realloc
之后调整大小。)
关于c - 读取一行时 c 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23979283/