使用循环形成字符串数组的问题

时间:2019-10-09 11:07:34

标签: c++ string c++11

我想使用循环输入创建一个字符串数组,然后为字符串的每个字符提供基于ASCII的输出。

这是我的代码

int n;
cin >> n;
string arr[n];
for(int i=0;i<n;++i){
    getline(cin,arr[i]);
}
for(int i = 0;i < n; ++i){
    for(int j = 0;j < arr[i].length(); ++j){
        cout << to_string(arr[i].at(j)) << " ";
    }
    cout << endl;
}

程序采用n:字符串输入数 但只允许我输入n-1个字符串。

这是什么问题?

4 个答案:

答案 0 :(得分:4)

您正在阅读n字符串,但第一个字符串不包含您的期望。

在控制台中编写输入时,您将编写如下内容:

3\nstring1\nstring2

,其中\n是换行符(按Enter键时)。

当您执行cin >> n时,您将解析此输入字符串,并获得整数。意味着你会留在这里

\nstring1\nstring2
缓冲区中的

。当您执行getline时,您将解析所有内容,直到第一条换行符(包括换行符)。这就是为什么第一个字符串为空的原因。

一个快速而肮脏的解决方法是也读取换行符:

int n;
char newline;
cin >> n >> newline;

,然后像现在一样循环。


关于您的代码的一些评论。

string arr[n]无效的C ++。在C ++中,没有像这样的大小可变的数组的官方支持(某些编译器支持它,但这并不意味着它是标准的)。您应该使用std::vector

std::vector<std::string> arr(n);

(其余代码保持不变)。更好的方法是将其声明为空,然后使用push_back进行填充。

此外,在比较j < arr[i].length()时,您正在比较类型为int的变量和类型为size_t的变量,该变量可能比int大,从而产生了问题对于很长的字符串。使用size_t作为j的类型。

答案 1 :(得分:1)

使用std :: vector

向量是动态数组。所以改变:

string arr[n];

std::vector<std::string> arr(n);

答案 2 :(得分:1)

根据您的代码片段,您要读取的是多个字符串,然后为每个字符串输出其所有字符的ASCII值:

如果您输入以下内容

2
abc
def

您希望获得如下结果:

97 98 99 
100 101 102 

为了实现这一点,我发现您的代码至少存在两个问题。

  1. C ++默认情况下不支持可变大小的数组。这意味着您无法创建在编译时大小未知的数组(有关此信息的更多信息,请参见this answer

  2. 为了输出char的ASCII,您只需要将char强制转换为int就可以了。

  3. 在这种情况下,使用getline
  4. 使代码复杂化,因为getline与换行符一起工作的方式。只需使用cin>>arr[i]来读取每个字符串。

这是您所期望的代码版本:

int n;
   cin>>n;
   vector<string> arr(n);

   for(int i=0;i<n;++i)
        cin>>arr[i];

    for(const auto& s : arr){
        for(const auto& c : s){
            cout<<(int)c<<" ";
        }
        cout<<endl;
    }

答案 3 :(得分:0)

如果需要字符串列表,可以使用vector

#include<vector>
#include<string>

int n;
cin >> n;
vector<string> arr(n);
for(int i = 0; i < n; ++i){
    getline(cin, arr[i]);
}
for(auto& str : arr){
    for(auto& c : str){
        cout << to_string(c) << " ";
    }
    cout << endl;
}