我正在创建一个程序,它从用户那里获取输入,而每个输入都包含用空格分隔的int。例如“2 3 4 5”。
我很好地实现了atoi功能,但是,每当我尝试在字符串上运行并“跳过”空格时,我就会遇到运行时错误:
for(int i=0, num=INIT; i<4; i++)
{
if(input[i]==' ')
continue;
string tmp;
for(int j=i; input[j]!=' '; j++)
{
//add every char to the temp string
tmp+=input[j];
//means we are at the end of the number. convert to int
if(input[i+1]==' ' || input[i+1]==NULL)
{
num=m_atoi(tmp);
i=j;
}
}
}
在'if(输入[i + 1] ==''.....''行中,我得到一个例外。 基本上,我试图插入“2 2 2 2”。 我意识到每当我尝试比较字符串中的真实空间和''时,异常就会引发。
我试图将空间的ASCII值与32进行比较,但也失败了。 有什么想法吗?
答案 0 :(得分:3)
问题是你没有检查主循环中字符串的结尾:
for(int j=i; input[j]!=' '; j++)
应该是:
for(int j=i; input[j]!=0 && input[j]!=' '; j++)
另外,不要将NULL
用于NUL字符。您应该使用'\0'
或0
。宏NULL
应仅用于指针。
也就是说,在您的情况下使用strtol
或istringstream
或类似内容可能会更容易。
答案 1 :(得分:2)
但两个很重要的评论。
您应该注意C ++流库自动从空格分隔的流中读取和解码int:
int main()
{
int value;
std::cin >> value; // Reads and ignores space then stores the next int into `value`
}
因此,要读取多个整数,只需将其置于循环中:
while(std::cin >> value) // Loop will break if user hits ctrl-D or ctrl-Z
{ // Or a normal file is piped to the stdin and it is finished.
// Use value
}
阅读一行。它包含空格分隔值,只需将该行读入字符串(将其转换为流然后读取值。
std::string line;
std::getline(std::cin, line); // Read a line into a string
std::stringstream linestream(line); // Convert string into a stream
int value;
while(linestream >> value) // Loop as above.
{
// Use Value
}