我想制作一个列表,例如 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';
}
最佳答案
一个字符串是一个内存块(一个数组),它包含char
,以'\0'
结束。 char *
不是字符串;它只是指向字符串中第一个 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 个字符,您只需向系统请求足够的内存来容纳 11 个字符(10 个字符 + '\0'
)。如果您想读入一个文件,而您不知道该文件有多大,这一点很重要。
顺便问一下,为什么要将 LINEMAX
和 LISTMAX
作为单独的常量?你能想出它们可能不同的原因吗?为什么不将 10
设为常量?这不是更好吗?
#define LINEMAX 100
#define NUMBER_OF_LINES 10
// ...
char list[NUMBER_OF_LINES][LINEMAX];
// ...
for (i = 0; i < NUMBER_OF_LINES; i++)
关于c - 为什么这个c程序会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19073773/