由于某些原因,我的原型程序没有按预期输出。
我的文字文件:(以标签分隔)
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 存储到考勤中。
答案 0 :(得分:1)
改变这个:
if (name.at(0) == 0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
对此:
if (isdigit(name.at(0)))
您的代码中有两个不同的错误:
if
语句结构不正确(我甚至惊讶于编译)
例如,为了检查字符是否为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
函数中不允许有许多语言构造一样。)