C ++程序未按预期输出(使用.at,if / else,getline)

时间:2014-09-16 13:01:14

标签: c++ if-statement output getline

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

我的文字文件:(以标签分隔)

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 存储到考勤中。

3 个答案:

答案 0 :(得分: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)进行比较

答案 1 :(得分:0)

您需要修复if声明:

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

用于if语句,如另一个答案中所述。

现在为你陈述的问题:

  

&#34;由于某种原因,它将字符串NameThree存储到出勤并输出。我期待将NameFour存入考勤中。&#34;

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

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

评估为true 其余代码(获取name4等)位于else的{​​{1}}块中。
因此,执行if之后的所有内容(并且执行if)并且其余代码在else块(以及后面的attendance = name3;)结束之前不会运行。< / p>

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

if

并且不要忘记if (expr) { //run if expr == true } else { //run if expr == false } 0,而其他所有内容在投放到false时都会映射到true

答案 2 :(得分:0)

如果有人想知道如何

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

甚至编译,因为C(和扩展名C ++)语言将,定义为二元运算符,如/->。它具有最低优先级,左关联性,其结果是右侧的值。所以上面的表达式被评估为:

(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)

进入调用表达式。请注意,, - 分隔列表中的最后一项是&#34; inline&#34;的返回值。功能。毋庸置疑,内联函数中不允许使用许多语言结构(就像现在constexpr函数中不允许有许多语言构造一样。)