您好我正在尝试从用户那里获取一个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问题。感谢所有人的帮助!
答案 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';
}