从命令行获取输入?

时间:2016-04-30 16:57:58

标签: c loops pointers unix char

我想将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]);
    }
}

3 个答案:

答案 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