你如何解析一个C字符串?

时间:2014-03-19 00:33:03

标签: c++ string parsing queue cstring

您好我正在尝试从用户那里获取一个c-string,将其输入一个队列,根据其内容用一个空格解析数据,并输出它的数据类型(int,float,word)不是字符串)。

E.g。 Bobby Joe在3.5个月内获得了12分钟。

Word:Bobby

Word:Joe

Word:是

整数:12

Word:in

Float:3.5

字:几个月

到目前为止,这是我的代码:

int main()
{
    const int maxSize = 100;

    char cstring[maxSize];

    std::cout << "\nPlease enter a string: ";
    std::cin.getline(cstring, maxSize, '\n');

//Keyboard Buffer Function
buffer::keyboard_parser(cstring);

return EXIT_SUCCESS;
}

功能:

#include <queue>
#include <string>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <vector>

namespace buffer
{
    std::string keyboard_parser(char* input)
{
    //Declare Queue
    std::queue<std::string> myQueue;

    //Declare String
    std::string str;

    //Declare iStringStream
    std::istringstream isstr(input);

    //While Loop to Read iStringStream to Queue
    while(isstr >> str)
    {
        //Push onto Queue
        myQueue.push(str);

        std::string foundDataType = " ";

        //Determine if Int, Float, or Word
        for(int index = 0; index < str.length(); index++)
        {
            if(str[index] >= '0' && str[index] <= '9')
            {
                foundDataType = "Integer";
            }
            else if(str[index] >= '0' && str[index] <= '9' || str[index] == '.')
            {
                foundDataType = "Float";
                                    break;
            }
            else if(!(str[index] >= '0' && str[index] <= '9'))
            {
                foundDataType = "Word";
            }
        }

        std::cout << "\n" << foundDataType << ": " << myQueue.front();
        std::cout << "\n";

        //Pop Off of Queue
        myQueue.pop();
        }
}   
}

现在使用此代码,它没有命中cout语句,它会转储核心。

我已经阅读了有关使用find成员函数和substr成员函数的内容,但我不确定我究竟需要如何实现它。

注意:这是作业。

提前致谢!

更新:好的一切似乎都有效!使用break语句修复了float和integer问题。感谢所有人的帮助!

2 个答案:

答案 0 :(得分:1)

您的队列是明智的:它包含std::string个。不幸的是,每个都是由你在没有任何长度信息的情况下传递cstring来初始化的,因为你肯定不是空终止C字符串(事实上,你是一个接一个的(每一个),这是严重的麻烦。

直接阅读std::string

答案 1 :(得分:0)

std::istream对于在C ++中解析文本非常有用...通常首先从字符串中读取一行,然后从使用行内容构造的std::istringstream进一步解析。

const char* token_type(const std::string& token)
{
    // if I was really doing this, I'd use templates to avoid near-identical code
    // but this is an easier-to-understand starting point...
    {
        std::istringstream iss(token);
        int i;
        char c;
        if (iss >> i && !(iss >> c)) return "Integer";
    }
    {
        std::istringstream iss(token);
        float f;
        char c; // used to check there's no trailing characters that aren't part
                // of the float value... e.g. "1Q" is not a float (rather, "word").
        if (iss >> f && !(iss >> c)) return "Float";
    }
    return "Word";
}

const int maxSize = 100;  // Standard C++ won't let you create an array unless const
char cstring[maxSize];
std::cout << "\nPlease enter a string: ";
if (std::cin.getline(cstring, maxSize, '\n'))
{
    std::istringstream iss(cstring);
    std::string token;
    while (iss >> token) // by default, streaming into std::string takes a space-...
        token_queue.push(token);    // ...separated word at a time

    for (token_queue::const_iterator i = token_queue.begin();
         i != token_queue.end(); ++i)
        std::cout << token_type(*i) << ": " << *i << '\n';
}