【问题标题】:C++ Program Not Outputting as expected (using .at, if/else, getline)C++ 程序未按预期输出(使用 .at、if/else、getline)
【发布时间】:2014-09-16 13:01:14
【问题描述】:

由于某种原因,我的原型程序没有按预期输出。

我的文本文件:(以制表符分隔)

NameOne NameTwo NameThree   56789 

我的源代码:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{
    string name1, name2, name3, name4, name5,fullName;
    ifstream inFile;
    string attendance;
    int index;

    inFile.open("test2.dat");
    getline(inFile, name1, '\t');
    getline(inFile, name2, '\t');
    getline(inFile, name3, '\t');
    if (name3.at(0) == 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    {
        attendance = name3;
        fullName = name1 + ' ' + name2;
    }
    else
    {
        getline(inFile, name4, '\t');
        if (name4.at(0) == 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
        {
            attendance = name4;
            fullName = name1 + ' ' + name2 + ' ' + name3;
        }
        else
        {
            getline(inFile, name5, '\t');
            if (name5.at(0) == 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
            {
                attendance = name5;
                fullName = name1 + ' ' + name2 + ' ' + name3 + ' ' + name4;
            }
            else
            {
                fullName = name1 + ' ' + name2 + ' ' + name3 + ' ' + name4 + ' ' + name5;
                inFile >> attendance;
            }
        }
    }

    cout << endl << fullName << endl << attendance << endl << endl;
    system("pause");
    return 0;
}

预期输出:

NameOne NameTwo NameThree 
56789

实际输出:

NameOne NameTwo
NameThree

出于某种原因,它会将字符串 NameThree 存储到出席中并输出。 我期待将 NameFour 存储到出席中。

【问题讨论】:

  • 您希望if (name3.at(0) == 0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 做什么?打开编译器警告,让编译器指出你的方式的错误。
  • name3.at(0) == 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 是什么意思?
  • 我不认为这个问题需要被否决,它在所有方面都可以
  • @barakmanos 如果字符串的第一个字符是数字

标签: c++ if-statement output getline


【解决方案1】:

改变这个:

if (name.at(0) == 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

到这里:

if (isdigit(name.at(0)))

您的代码中有两个不同的错误:

  1. if 语句结构不正确(我很惊讶它甚至可以编译)

  2. 为了检查一个字符是否是0位,例如,你应该将它与'0'(而不是0)进行比较

【讨论】:

  • 谢谢。下次我必须打开编译器警告
  • @user3538295:总是启用编译器警告,并注意它们,除非您喜欢猜测代码可能存在的问题。
  • 我很惊讶它竟然可以编译 - 这个name.at(0) == 0, 1, 2, 3, 4, 5, 6, 7, 8, 9的结果是9,因为我们有comma operator
  • @user2451677:这更像是一种“说话方式”,强调这不是“普通的编码习惯”。语言标准允许它的事实并没有使它成为您想要放入代码中的东西(除非您希望将来某个时候再次查看它并问自己“我到底有什么记住这里?”)。
【解决方案2】:

您需要修复您的 if 语句:

if (isdigit(name.at(0)))

对于另一个答案中已经说明的 if 语句。

现在回答您提出的问题:

“由于某种原因,它将字符串 NameThree 存储到出席中并输出。我希望将 NameFour 存储到出席中。”

这是因为您的第一个 if 中的表达式通过了。

name3.at(0) == 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

不幸的是,计算结果为true
您的其余代码(获取name4 等)位于ifelse 块中。
因此,if 之后的所有内容都会被执行(并且 attendance = name3; 会被执行),而你的其余代码直到 else 块(以及下面的 cout)结束时才会运行。

请记住,if 的工作方式如下:

if (expr)
{
   //run if expr == true
}
else
{
  //run if expr == false
}

不要忘记0false,当转换为boolean 时,其他所有内容都映射到true

【讨论】:

    【解决方案3】:

    如果有人想知道如何

    if (name4.at(0) == 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    

    甚至可以编译,这是因为 C(以及扩展为 C++)语言将, 定义为二元运算符,如/-&gt;。它具有最低的优先级,左结合性,其结果是右侧的值。所以上面的表达式被计算为:

    (name4.at(0) == 0, 1) => 1
    (1, 2) => 2
    ...
    (8, 9) => 9
    if(9) => true
    

    (除此之外,C++ 甚至允许您覆盖 operator,。强烈建议不要这样做。)

    在您对此感到愤怒之前,请记住,在 C++ 的早期,内联函数是这样实现的,在本机编译器出现之前,您使用名为 cfront 的工具将您的 C++ 转换为然后将 C 提供给 C 编译器。例如,如果你写:

    inline int List::read() const
    {
        int x = *head++;
        if(head == end)
            head = begin;
        return x;
    }
    

    然后,当您实际调用该函数时,cfront 会插入类似

    的内容
    (__inl_x = *obj->head, ++obj->head, obj->head = (obj->head == obj->end? 
        obj->begin: obj->head), __inl_x)
    

    进入调用表达式。请注意,, 分隔列表中的最后一件事是“内联”函数的返回值。不用说,内联函数中有很多语言结构是不允许的(就像现在constexpr 函数中不允许有很多语言结构一样。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2020-04-09
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      相关资源
      最近更新 更多