我正在尝试获取用户输入并将其放入由空格分隔的cstrings数组中。当我将数组打印到屏幕上时,我什么都没得到。我确信我做的事情很愚蠢,但我一直在尝试不同的方式。任何帮助,将不胜感激。这是代码。
#include <iostream>
#include <cstring>
using namespace std;
void stuff(char command[][25], int length)
{
char ch;
for(int i = 0; i < length; i ++)
{
int b = 0;
cin.get(ch);
while(!isspace(ch))
{
command[i][b++] = ch;
cin.get(ch);
}
command[i][b] = '\0';
cout << endl;
}
}
int main()
{
char cha[10][25];
char ch;
int len = 0;
while(ch != '\n')
{
cin.get(ch);
if(isspace(ch))
{
len++;
}
}
stuff(cha,len);
for(int i = 0; i < len; i++)
{
cout << cha[i] << endl;
}
cout << len << endl;
return 0;
}
答案 0 :(得分:2)
a)当你第一次用while (ch != '\n')
测试时,ch是未定义的。将其初始化为零或其他东西。
b)你没有在while循环中将任何值写入cha。也许是这样的事情:
int pos = 0;
while(ch != '\n') {
cin.get(ch);
if (isspace((unsigned)ch)) {
if (pos > 0) {
++len;
pos = 0;
}
}
else {
cha[len][pos] = ch;
++pos;
}
}
c)您正在stuff(...)
中再次阅读该流,但已经在main()
中消费了您想要从该流中获得的内容。
d)此代码遭受许多缓冲区溢出和堆栈损坏的机会。也许使用std::vector<std::string>
代替。如果内存不足,它将抛出异常,而不是在堆栈上弄乱。
也许是这样的(未经测试):
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void main()
{
typedef std::vector<std::string> strvec;
strvec cha;
std::string s;
char ch = 0;
while(ch != '\n') {
cin.get(ch);
if (isspace((unsigned)ch)) {
if (!s.empty()) {
cha.push_back(s);
s.clear();
}
}
else {
s.push_back(ch);
}
}
// don't need to call 'stuff' to null terminate.
for (strvec::iterator i = cha.begin(); i != cha.end(); ++i) {
cout << *i << endl;
}
cout << cha.size() << endl;
}
这可能比它更有效,但希望它很容易理解。
答案 1 :(得分:0)
你正在阅读整个while循环中的整个输入读取长度(字符串数),但你永远不会存储它。稍后在stuff
cin.get
中将不读任何内容。也许在第一个周期中将输入存储在cha中?