0

我想制作一个列表,例如10通过键盘输入的句子。为了得到一条线,我正在使用一个函数getline()。谁能解释为什么这个程序在进入第二行时会崩溃?错误在哪里?

#define LISTMAX 100
#define LINEMAX 100
#include <stdio.h>
#include <string.h>
void getline(char *);
int main ()
{
    char w[LINEMAX], *list[LISTMAX];
    int i;
    for(i = 0; i < 10; i++)
    {
        getline(w);
        strcpy(list[i], w);
    }
    for(i = 0; i < 10; i++)
        printf("%s\n", list[i]);
    return 0;
}

void getline(char *word)
{
    while((*word++ = getchar()) != '\n');
    *word = '\0';
}
4

1 回答 1

2

字符串是一个内存块(一个数组),它包含chars,以 . 结尾'\0'。Achar *不是字符串;它只是一个指向char字符串中第一个的指针。

strcpy创建新字符串。它只是将数据从一个内存块复制到另一个内存块。所以你的问题是:你没有分配一块内存来保存字符串。

我将向您展示两种解决方案。第一个解决方案是:更改声明,list使内存已经分配。如果你这样做,你可以避免使用strcpy,所以你的代码更简单:

// no need for w
char list[10][LISTMAX];

// ...

// get the line straight into list
// no need to copy strings
getline(list[i]);

但是,如果您想扩展自己,第二种解决方案是在您知道需要时分配内存块。你需要在 C 中做很多事情,所以现在也许是学习这项技术的好时机:

#include <stdlib.h> // include the malloc function

// ...

char w[LINEMAX], * list[LISTMAX]

// put this line between the getline and strcpy lines
list[i] = (char *) malloc((strlen(w) + 1) * sizeof(char));

此解决方案更复杂,但您只需为字符串分配所需的内存。如果字符串长度为 10 个字符,则您只需向'\0'系统请求足够的内存来保存 11 个字符(10 个字符 + )。如果您想读入一个文件,而您不知道该文件有多大,这一点很重要。

顺便说一句,为什么你有LINEMAXLISTMAX作为单独的常数?你能想出它们可能不同的原因吗?你为什么不做10一个常数?这不是更好吗?

#define LINEMAX 100
#define NUMBER_OF_LINES 10

// ...

char list[NUMBER_OF_LINES][LINEMAX];

// ...

for (i = 0; i < NUMBER_OF_LINES; i++)
于 2013-09-29T02:54:01.210 回答