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

标签 c line next

我想读取用户输入(如终端)直到写入退出或 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/

相关文章:

android - openssl C与android之间的跨平台AES/CBC加密解密

c - 我无法从文件中读取超过 49 个结构数组

c++ - 在 C++ 中使用 y = mx + b 公式移动圆

jquery - jQuery播放声音并转到下一页

objective-c - 有没有办法读取 TypedStream 格式的文件

c - 是否有必要调用 pthread_exit()

c - 引用 C 静态库中的文件

matlab - 更改两行图形标题中的字体

当值为零时,Matlab 线图与轴重叠

jquery - 如何仅更改下一个 h2 的背景图像