Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读一行时c语言中的分段错误_C_Line_Next - Fatal编程技术网

读一行时c语言中的分段错误

读一行时c语言中的分段错误,c,line,next,C,Line,Next,我希望读取用户输入(如终端),直到写入exit或按下ctrl+c/ctrl+d。我阅读每一行(直到按下return/enter),检查它是空格还是注释(#),然后执行一些函数 我尝试了三种方法,但没有成功。每次插入字符串并按enter键时都会出现错误 char line[256]; while(printf("%s>", shell_name) && scanf("%50[^\n]", line) != EOF) { 分段故障(堆芯转储) 注意:应为“size\u t*r

我希望读取用户输入(如终端),直到写入exit或按下ctrl+c/ctrl+d。我阅读每一行(直到按下return/enter),检查它是空格还是注释(#),然后执行一些函数

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

char line[256];
while(printf("%s>", shell_name) && scanf("%50[^\n]", line) != EOF)
{
分段故障(堆芯转储)

注意:应为“size\u t*restrict”,但参数的类型为“int”

while(printf("%s>", shell_name) && fgets(line, sizeof(line), stdin) != NULL)
{
分段故障(堆芯转储)

下一步我会做更多的介绍

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

我做错了什么?是否有更合适/更简单/更好的选项?

由于您进入无限循环,segfault可能会启动:
scanf(“%50[^\n]”,第行)
读取您的输入并在返回时停止。返回值不会被消耗,而是停留在输入缓冲区中。那么下次会发生什么呢
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] != "#")
--海湾合作委员会抱怨

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]!=“#”
,可以更简洁地写成
行[0]!='#'


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

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
来调整大小。)

有趣的是——我注意到的第一件事是你似乎确信这是可以的:
printf(“%s”,strcat(shell_name,“>”)
,因为你到处都用。试试
printf(“%s>”,shell\u name)
。愚蠢的错误:)被解决它的strcatDid困扰了吗因此,要么是一个静态字符串(因此不能修改),要么是大量字符使其溢出的
shell\u name
,不,它以前工作过,它打印mysh>并等待输入,但一旦我输入命令并按enter键,我就会得到你想要的分段错误
*line
line[0]
而不是
&line
。请不要忽略编译器警告,尤其是关于不匹配类型的警告。
char*ptr\u to\u line=linegetline
想要重新分配缓冲区,code>会给您带来麻烦。使用
0
NULL
是更好的选择!谢谢,将“可以”改为“应该”。应该可以:)我会改变整个代码块。你永远无法确定没有人会在不阅读下面的文本的情况下使用它。@rmartinjak实际上,如果我按空格键(一次或几次),然后按enter键,程序不会忽略它,但仍在等待输入。另外,我如何忽略回车,尝试行[0]!='\n',但它不起作用
size_t line_size = 0;
char *ptr_to_line = NULL;

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