if(isspace())语句不能正常工作C ++

时间:2016-11-03 18:42:49

标签: c++ loops for-loop isspace

我正在为我的程序开发一个函数,它从文本文件中读取名字和姓氏并将它们保存为两个字符串。但是,当for循环到达名字和姓氏之间的第一个空格时,我无法获取if(isspace(next))语句。

这是完整的程序

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <ctype.h>

using namespace std;

void calcAvg(ifstream& in, ofstream& out);

int main()
{
  //open input and output file streams and check for any failures
  ifstream input;
  ofstream output;
  input.open("lab08_in.txt");
  output.open("lab08_out.txt");
  if(input.fail())
  {
    cout << "Error: File not Found!" << endl;
    exit(1);
  }
  if(output.fail())
  {
    cout << "Error: File creation failed!" << endl;
    exit(1);
  }
  calcAvg(input, output);

  return 0;
}

void calcAvg(ifstream& in, ofstream& out)
{
  int sum = 0;
  double average;

  //save first and last name to strings
  string firstname, lastname;
  char next;
  int i = 1;
  in >> next;
  for(; isalpha(next) && i < 3; in >> next)
  {
    if(i == 1)
    {
        firstname += next;
        cout << next << " was added to firstname" << endl;
        if(isspace(next))
        {
            cout << "Space!" << endl;
            out << firstname << ' ';
            i++;
        }
    }
    else if(i == 2)
    {
        lastname += next;
        cout << next << " was added to lastname" << endl;
        if(isspace(next))
        {
            cout << "Space!" << endl;
            out << lastname << ' ';
            i++;
        }
     }
  }
}

我遇到麻烦的代码部分是

 if(isspace(next))
        {
            cout << "Space!" << endl;
            out << firstname << ' ';
            i++;
        }

代码应该(在我看来)从文件中读取每个字符并添加到字符串中,一旦到达空格,将字符串 firstname 写入输出文件,但它没有&# 39; t,而是我在控制台中获得此输出

H was added to firstname
e was added to firstname
s was added to firstname
s was added to firstname
D was added to firstname
a was added to firstname
m was added to firstname

等...

注意这个名字应该是Hess Dam ....并且应该发生的是它将Hess保存到 firstname 和Dam ...到 lastname 。相反,它只是将整个内容添加到 firstname 字符串中的姓氏之后的选项卡,并且它永远不会写入输出文件。它读取选项卡,因为它退出for循环(来自isalpha(下一个))但是isspace(next)参数由于某种原因不起作用

3 个答案:

答案 0 :(得分:1)

您正在检查for {循环中next是否为字母字符:for(; isalpha(next) && i < 3; in >> next)
根据{{​​3}},&#34;空间&#34;字符在默认C语言环境中不被视为字母字符。您可以更改您的区域设置以解决此问题,或者更优选地(在我看来)修改for循环以接受空格。
for(; (isalpha(next) || isspace(next)) && i < 3; in >> next)这样的东西应该允许循环处理空格以及字母字符

编辑:正如其他几位人士指出的那样,我错过了使用&gt;&gt;的事实。这里的运算符会让你永远不会看到空格,所以我的答案并不完整。我会离开它,以防万一它仍然有用。

答案 1 :(得分:1)

很抱歉,没有评论它的声誉,但有两个错误的答案。来自zahir的评论是正确的。对于is中的下一个字符c,std :: isspace(c,is.getloc())为true(此空白字符保留在输入流中)。运营商&gt;&gt;永远不会返回空格。

答案 2 :(得分:0)

您的问题不在于isspace功能,在您的for循环中,您迫使for循环仅使用{来处理字母字符{1}},在这种情况下,字符不能是isalphaiscntrlisdigitispunct)。看看this