在这行代码中:
scanf("%s", &word[i]);
您需要确保word[i]
指向某个位置并具有足够的空间来容纳输入的字符串。由于word[i]
是一个char *
指针,因此您需要在某个时候为其分配内存。否则,它只是悬空指针不指向任何地方。
如果您想继续使用 scanf()
,那么您可以事先使用malloc
来分配一些空间。
malloc()
在堆上分配请求的内存,然后返回一个void*
指针。
您可以像这样在您的代码中应用malloc()
:
size_t malloc_size = 100;
for (i = 0; i < 3; i++) {
word[i] = malloc(malloc_size * sizeof(char));
printf("Enter word: ");
scanf("%99s", word[i]);
}
注意:必须检查malloc()
的返回值,因为在不成功时它可能会返回NULL
。
此外,每当您使用malloc()
分配内存时,都必须使用free
在结束时释放所请求的内存:
free(word[i]);
word[i] = NULL;
使用fgets作为另一种不需要scanf的方法
一个更加恰当的读取字符串的方式应该使用fgets
函数。
char *fgets(char *str, int n, FILE *stream)
从输入流中读取一行,并将字节复制到char *str
中,该缓冲区必须被给定一个大小为n
字节的阈值。
需要注意的事项:
- 在缓冲区的末尾添加了
\n
字符,可以轻松地删除它。
- 在出现错误时,返回
NULL
。如果没有读取任何字符,则在结尾处仍然返回NULL
。
- 缓冲区必须是静态声明的,具有给定的大小
n
。
- 读取指定的流。可以是
stdin
或FILE *
。
以下是使用它从stdin
中读取输入行的示例:
char buffer[100]; /* statically declared buffer */
printf("Enter a string: ");
fgets(buffer, 100, stdin); /* read line of input into buffer. Needs error checking */
带有注释的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUMSTR 3
#define BUFFSIZE 100
int main(void) {
char *words[NUMSTR];
char buffer[BUFFSIZE];
size_t i, count = 0, slen;
for (i = 0; i < NUMSTR; i++) {
printf("Enter a word: ");
if (fgets(buffer, BUFFSIZE, stdin) == NULL) {
fprintf(stderr, "Error reading string into buffer.\n");
exit(EXIT_FAILURE);
}
slen = strlen(buffer);
if (slen > 0) {
if (buffer[slen-1] == '\n') {
buffer[slen-1] = '\0';
} else {
printf("Exceeded buffer length of %d.\n", BUFFSIZE);
exit(EXIT_FAILURE);
}
}
if (!*buffer) {
printf("No string entered.\n");
exit(EXIT_FAILURE);
}
words[count] = malloc(strlen(buffer)+1);
if (!words[count]) {
printf("Cannot allocate memory for string.\n");
exit(EXIT_FAILURE);
}
strcpy(words[count], buffer);
count++;
}
printf("\nYour strings:\n");
for (i = 0; i < count; i++) {
printf("words[%zu] = %s\n", i, words[i]);
free(words[i]);
words[i] = NULL;
}
return 0;
}
示例输入:
Enter a word: Hello
Enter a word: World
Enter a word: Woohoo
输出:
Your strings:
words[0] = Hello
words[1] = World
words[2] = Woohoo
:)
。 - David C. Rankin