如何使用cin读取字符数据以存储在数组中并显示

how to read character data using cin to store in an array and display?

本文关键字:数组 显示 存储 cin 何使用 读取 字符 数据      更新时间:2023-10-16

我正在编写一个简单的控制台应用程序来读取3个单词并将它们保存在一个数组中。但是,在从控制台中输入三个单词之后,它只在控制台中显示第三个单词三次。例如,如果我输入:"one","two","three",输出只显示"three"3次)。

下面是我的代码:
int main(int argc, char *argv[])
{
    char* input[30];  
    char word[30]; 
    int i=0;
    for(i=0; i<3 ;++i)
    {
       cin >> word;
       input[i] = word;
    }
    input[i] = 0;
    i=0;
    while(input[i])
    {
      cout << input[i] << endl;
      i++;
    }
    return 0;
}

我在这里做错了什么?谢谢你的帮助。

您只有一个缓冲区(char word[30]),每次都要覆盖它。

当你这样做的时候:

input[i] = word;

您将该缓冲区中的第一个元素的地址分配给input中的每个元素(当您使用裸名称时,数组会降级为指针)。你最终得到了input[]中相同地址的三个副本(这是word的地址,它包含了你从cin中读取的最后一件事)

解决这个问题的一种方法是使用strdup()并将新分配的字符串分配给input[i]
for(i=0; i<3 ;++i)
{
   cin >> word;
   input[i] = strdup(word);
}

也……如果你只需要三个输入词,你只需要一个包含3个char指针的数组:

char *input[3];

和输出循环看起来很像输入循环:

for(i=0; i<3 ;++i)
{
   cout << input[i] << endl;
}

Edit:请注意,这个答案是基于您想要使用数组。如果这不是需要这样做的作业,请参阅bobbymcr的答案-当使用c++时,请使用c++。

您的问题标记为" c++ "(而不是"C"),因此我建议您实际使用c++习惯用法来完成此操作。现代程序不应该使用原始的char数组和指针,除非用于低级编程和与遗留或基本C api的互操作性。

考虑使用stringvector,因为它们将使您的生活更轻松。下面是使用这些类型的程序的重新实现。除了迭代器的东西(我承认在你习惯它之前有点奇怪),它应该比使用char *等的等效代码清晰得多。

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char ** argv)
{
    vector<string> input;
    for (int i = 0; i < 3; ++i)
    {
        string word;
        cin >> word; 
        input.push_back(word);
    }
    for (vector<string>::const_iterator it = input.cbegin(); it != input.cend(); ++it)
    { 
        cout << *it << endl;
    }
    return 0;
} 

问题就在这里:

char* input[30]; 

你可能会认为这是字符数组的数组,但本质上不是。

你要么需要动态地为数组分配空间,要么简单地使用二维字符数组(固定你可以拥有的最大单词数)。

char input[30][30]; // maximum 30 words having at most 29 characters each