【问题标题】:Program crashed after one line input. How to fix?一行输入后程序崩溃。怎么修?
【发布时间】:2019-01-02 06:48:06
【问题描述】:

我已经做了一个我的getline函数的程序。直到遇到'\n'并转移到下一个输入。此外,我在这里使用指针数组来存储字符串输入,但程序在第一个字符串输入后崩溃。有什么问题?

这是程序的代码。我试过调试它,但我在这里找不到问题。

#include<stdio.h>
#include<stdlib.h>

void getline2(char *s)
{
    char c;
    while((c=getchar())!='\n')
    {
        *s=c;
        s++;
    }
    *s='\0';
}

int main()
{
    char *lines[3];
    int i=0;
    while(i<3)
    {
        getline2(lines[i]);
        i++;
    }
    for (i = 0; i < 3; i++)
    {
        printf("\n%s", lines[i]);
    }
    return 0;
}

当我按下回车后输入第一行时程序崩溃。

【问题讨论】:

  • 您已经声明了一个指针数组,但尚未为指针分配内存。因此,您的代码具有未定义的行为。
  • 好奇:谁或什么文字建议将"\n" 放在"\n%s"开始 处?
  • 阅读How to debug small programs。这样的bug你应该可以自己找出来的。
  • 如果printf 循环不相关,则应将其从minimal reproducible example 中删除。
  • @chux 我不同意。它已经在 printf 之前崩溃了。 main 中的 while 循环也可能是噪音。 getline2(lines[0]) 足以导致崩溃。

标签: c pointers getline


【解决方案1】:

在您的代码中,char *lines[3]; 定义了一个 char 指针数组。指针本身不会自动指向任何有效的内存。除非正确初始化,否则尝试使用(或取消引用)它们会导致 undefined behavior

有两种常用方法可以实现您想要的(根据您的要求):

  • 在编译时分配大小并限制输入的长度 [即,将缓冲区的大小作为函数参数传递,例如 fgets()]
  • 在运行时分配内存(分配器函数,malloc() and family)并根据输入长度调整大小。

【讨论】:

    【解决方案2】:

    除了提供指向有效内存的char*(其他人也建议)之外,getline2() 还有其他弱点需要解决。

    尺寸未知

    getline2()不知道能保存多少个字符。建议接受大小参数并调整代码以防止过度填充s

    // void getline2(char *s)
    void getline2(char *s, size_t sz)
    

    EOF 上的无限循环

    stdin被关闭或出现罕见的输入错误时,getchar()可以永久返回EOF并且永远不会退出循环。

    257 个值不适合 char

    int fgetc() 返回unsigned charEOF 范围内的值。使用int c; 并为c != '\n' &amp;&amp; c != EOF 测试循环

    // char c;
    // while((c=getchar())!='\n')
    int c;
    while((c=getchar())!='\n' && c != EOF)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      相关资源
      最近更新 更多