一行输入后程序崩溃。怎么修?

时间:2019-01-02 06:48:07

标签: c pointers getline

我已经编写了我的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;
}

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

2 个答案:

答案 0 :(得分:4)

在您的代码中,def rectangle(matrix): R = len(matrix) C = len(matrix[0]) mtrx = [] for i in range(R): row = [] for j in range(C): #creating a matrix of 0 row.append(0) mtrx.append(row) for i in range(C): #copy first row matrix mtrx[0][i] = matrix[0][i] #counting the consecutive ones for j in range(R): if matrix[j][i] == 0: mtrx[j][i] = 0 else: mtrx[j][i] = mtrx[j-1][i]+1 #sort the rows for i in range(R): mtrx[i] = sorted(mtrx[i],reverse=True) #Traverse the sorted matrix to find maximum area max_area = 0 for i in range(R): for j in range(C): current = (j+1) * mtrx[i][j] if current > max_area: max_area = current return max_area matrix = [[0, 1, 0, 1, 0], [0, 1, 0, 1, 1], [1, 1, 0, 1, 0]] 定义了一个char *lines[3];指针的数组。指针本身不会自动指向任何有效内存。除非正确初始化,否则尝试使用(或取消引用)它们将导致undefined behavior

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

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

答案 1 :(得分:0)

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' && c != EOF的循环

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