我想使用循环输入创建一个字符串数组,然后为字符串的每个字符提供基于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
个字符串。
这是什么问题?
答案 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)
向量是动态数组。所以改变:
string arr[n];
到
std::vector<std::string> arr(n);
答案 2 :(得分:1)
根据您的代码片段,您要读取的是多个字符串,然后为每个字符串输出其所有字符的ASCII值:
如果您输入以下内容
2
abc
def
您希望获得如下结果:
97 98 99
100 101 102
为了实现这一点,我发现您的代码至少存在两个问题。
C ++默认情况下不支持可变大小的数组。这意味着您无法创建在编译时大小未知的数组(有关此信息的更多信息,请参见this answer)
为了输出char的ASCII,您只需要将char
强制转换为int
就可以了。
getline
的使代码复杂化,因为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;
}