超级基本代码:为什么我的循环没有中断?
Super basic code: Why is my loop not breaking?
for(int i=0;i<50;i++,size++)
{
cin >> inputnum[i];
cout << size;
if(inputnum[i] == '.')
{
break;
}
}
break打断了输入流但是size一直在输出。
大小的输出是012345678910111213...474849
。
我尝试将 size++ 放入循环中,但没有任何区别。之后的大小将等于50,这意味着它经历了完整的循环。
我忘了解释我在循环中添加了 cout << size debug/check 为什么即使我只输入了 3 个数字,它在循环后输出为 50。
我怀疑 inputnum
是 int
的数组(或其他一些数字类型)。当您尝试输入 '.'
时,实际上没有任何内容进入 inputnum[i]
- cin >> inputnum[i]
表达式实际上失败并将 cin
置于失败状态。
因此,当输入 '.'
字符时,inputnum[i]
不会改变,并且 break
永远不会被执行。
这是一个小而完整的程序中对您的代码稍作修改的版本,该程序演示了如何使用 !cin.good()
跳出输入循环:
#include <iostream>
#include <ostream>
using namespace std;
int main()
{
int inputnum[50];
int size = 0;
for(int i=0;i<50;i++,size++)
{
cin >> inputnum[i];
if (!cin.good()) {
break;
}
}
cout << "size is " << size << endl;
cout << "And the results are:" << endl;
for (int i = 0; i < size; ++i) {
cout << "inputnum[" << i << "] == " << inputnum[i] << endl;
}
return 0;
}
此程序会将输入收集到 inputnum[]
数组中,直到遇到 EOF 或无效输入。
什么是inputnum
?确保它是 char[]
!!使用 clang++ 可以编译并完美运行:
#include <iostream>
int main() {
int size = 0;
char inputnum[60];
for(int i=0;i<50;i++,size++) {
std::cin >> inputnum[i];
std::cout << size;
if(inputnum[i] == '.') {
break;
}
}
return 0;
}
(在我的例子中输出如下:)
a
0a
1s
2d
3f
4g
5.
6Argento:Desktop marinos$
只要您在循环中针对 char
测试 char
而不是其他东西,您的代码就可以接缝。是否 inputnum
是某个整数值?如果是这样,那么您的测试子句将始终评估为 false 除非 inputnum
匹配数值 '.'
被隐式转换为..
编辑
显然您确实在尝试将 char
放入 int[]
。尝试以下操作:
#include <iostream>
int main() {
using namespace std;
int size = 0;
int inputnum[50];
char inputchar[50];
for(int i=0;i<50;i++,size++) {
cin >> inputchar[i];
inputnum[i] = static_cast<int>(inputchar[i]); // or inputnum[i] = (int)inputchar[i];
cout << size << endl; // add a new line in the end
if(inputchar[i] == '.') break;
}
return 0;
}
那么这可能又是一项实验室作业,在实际程序中我永远不会这样编写代码。 Tat 将取决于要求,但我更喜欢使用 STL 容器和算法或字符串流。如果被迫以较低级别的 C 风格工作,我会尝试弄清楚“.”的数量。转换为(简单地通过 int a = '.'; cout << a;`)并将该数字直接放在测试子句中。然而,这样的代码可能很简单,但在我看来也是 BAD,它不安全,特定于实现,而不是真正的 C++。
for(int i=0;i<50;i++,size++)
{
cin >> inputnum[i];
cout << size;
if(inputnum[i] == '.')
{
break;
}
}
break打断了输入流但是size一直在输出。
大小的输出是012345678910111213...474849
。
我尝试将 size++ 放入循环中,但没有任何区别。之后的大小将等于50,这意味着它经历了完整的循环。
我忘了解释我在循环中添加了 cout << size debug/check 为什么即使我只输入了 3 个数字,它在循环后输出为 50。
我怀疑 inputnum
是 int
的数组(或其他一些数字类型)。当您尝试输入 '.'
时,实际上没有任何内容进入 inputnum[i]
- cin >> inputnum[i]
表达式实际上失败并将 cin
置于失败状态。
因此,当输入 '.'
字符时,inputnum[i]
不会改变,并且 break
永远不会被执行。
这是一个小而完整的程序中对您的代码稍作修改的版本,该程序演示了如何使用 !cin.good()
跳出输入循环:
#include <iostream>
#include <ostream>
using namespace std;
int main()
{
int inputnum[50];
int size = 0;
for(int i=0;i<50;i++,size++)
{
cin >> inputnum[i];
if (!cin.good()) {
break;
}
}
cout << "size is " << size << endl;
cout << "And the results are:" << endl;
for (int i = 0; i < size; ++i) {
cout << "inputnum[" << i << "] == " << inputnum[i] << endl;
}
return 0;
}
此程序会将输入收集到 inputnum[]
数组中,直到遇到 EOF 或无效输入。
什么是inputnum
?确保它是 char[]
!!使用 clang++ 可以编译并完美运行:
#include <iostream>
int main() {
int size = 0;
char inputnum[60];
for(int i=0;i<50;i++,size++) {
std::cin >> inputnum[i];
std::cout << size;
if(inputnum[i] == '.') {
break;
}
}
return 0;
}
(在我的例子中输出如下:)
a
0a
1s
2d
3f
4g
5.
6Argento:Desktop marinos$
只要您在循环中针对 char
测试 char
而不是其他东西,您的代码就可以接缝。是否 inputnum
是某个整数值?如果是这样,那么您的测试子句将始终评估为 false 除非 inputnum
匹配数值 '.'
被隐式转换为..
编辑
显然您确实在尝试将 char
放入 int[]
。尝试以下操作:
#include <iostream>
int main() {
using namespace std;
int size = 0;
int inputnum[50];
char inputchar[50];
for(int i=0;i<50;i++,size++) {
cin >> inputchar[i];
inputnum[i] = static_cast<int>(inputchar[i]); // or inputnum[i] = (int)inputchar[i];
cout << size << endl; // add a new line in the end
if(inputchar[i] == '.') break;
}
return 0;
}
那么这可能又是一项实验室作业,在实际程序中我永远不会这样编写代码。 Tat 将取决于要求,但我更喜欢使用 STL 容器和算法或字符串流。如果被迫以较低级别的 C 风格工作,我会尝试弄清楚“.”的数量。转换为(简单地通过 int a = '.'; cout << a;`)并将该数字直接放在测试子句中。然而,这样的代码可能很简单,但在我看来也是 BAD,它不安全,特定于实现,而不是真正的 C++。