我想将5个图书名称中的每一个存储在数组中并打印出来。但是我在这里做错了什么? 输出打印出最后一个条目5次。
#include <stdio.h>
int main(int argc, const char * argv[])
{
char * books[5];
char currentBook[1024];
for(int i = 0; i < 5; i++)
{
printf("Enter book:\n");
gets(currentBook);
books[i] = currentBook;
}
for(int i = 0; i <5; i ++)
{
printf("Book #%d: %s\n", i, books[i]);
}
}
答案 0 :(得分:2)
鉴于你的声明
char * books[5]; char currentBook[1024];
,这段代码......
books[i] = currentBook;
...将books[i]
指定为指向数组currentBook
开头的指针。您为各种i
多次执行此操作,从而导致指向同一数组的指针数组。当您稍后打印每个点所指向的字符串时,它当然是相同的字符串。
您可以使用strdup()
制作输入缓冲区的副本,而不是将books
的每个元素指定为指向相同的内容来解决问题。
答案 1 :(得分:0)
问题是,你的指针将指向同一个字符串currentbook
。
使用strdup()代替复制字符串:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char * argv[])
{
char *books[5];
char currentBook[1024];
for (int i = 0; i < 5; i++)
{
printf("Enter book:\n");
fgets(currentBook, sizeof(currentBook), stdin);
books[i] = strdup(currentBook);
}
for (int i = 0; i < 5; i++)
{
printf("Book #%d: %s\n", i, books[i]);
free(books[i]);
}
}
答案 2 :(得分:0)
我想将5个图书名称中的每一个存储在数组中
然后你需要定义一个合适的数组。
假设您要存储5个名称,每个名称的最大长度为42个字符,您需要定义一个包含5个元素的数组,每个元素都是42 + 1个字符的数组。
那就是像这样定义char
的二维数组
char books [5][42 + 1]; /* Define one more char then you need to store the
`0`-terminator char ending each C "string". */
并像这样使用
for(int i = 0; i < 5; i++)
{
printf("Enter book:\n");
fgets(books[i], 42 + 1, stdin);
}
为什么 不 使用gets()
,您可以在此处阅读:Why is the gets function so dangerous that it should not be used?
有关0
概念的更多信息 - 终止字符串:https://en.wikipedia.org/wiki/Null-terminated_string