我想要一个由空格分隔的cstrings数组

时间:2012-12-11 08:56:29

标签: c++

我正在尝试获取用户输入并将其放入由空格分隔的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;
}

2 个答案:

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