我试图制作一个程序,如果我输入整数,程序将找出较大的数字,然后减去较小的数字。这部分,我明白了。
问题是无限循环部分。
我试图让type in two integers
继续在while循环中打印,而在break
键入至少一个字符时继续打印。
例如,如果我输入2 @
,它将损坏。
但是我找不到在代码内获取break;
的写位置,因此,每当我输入一个字符时,它都会继续创建无限循环。
是否可以在此代码中创建中断?我谦虚地寻求建议...
以下是我无法放入break
的代码
(顺便说一句,我之所以在sizeof(i)==4 || sizeof(j)==4
之内做该条件是为了使它只能输入一个整数,因为整数的大小为4)
int main()
{
int i, j;
int result;
while (sizeof(i)==4 || sizeof(j)==4){
printf("type in two integers : ");
scanf("%d %d", &i, &j);
if (i < j) {
result = j - i;
}
else if (j < i){
result = i - j;
}
printf("%d\n", result);
}
return 0;
}
最下面的代码是我试图放入break
但失败的代码(它不断创建无限循环)...
int main()
{
int i, j;
int result;
while (sizeof(i)==4 || sizeof(j)==4){
if (sizeof(i) == 4 || sizeof(j) == 4) {
printf("type in two integers : ");
scanf("%d %d", &i, &j);
if (i < j) {
result = j - i;
}
else if (j < i) {
result = i - j;
}
printf("%d\n", result);
}
else
break;
}
return 0;
}
这是我摆脱sizeof
并使用while(1)
的代码,尽管break
不起作用的事实并没有太大变化。
int main()
{
int i, j;
int result;
while (1){
printf("type in two integers : ");
scanf("%d %d", &i, &j);
if (i < j) {
result = j - i;
}
else if (j < i) {
result = i - j;
}
printf("%d\n", result);
}
return 0;
}
答案 0 :(得分:3)
您不能使用sizeof(i)
进行运行时检查!这是一个 编译时间 常量,在您的情况下(32位整数)将始终求值为 4 >。
为了检查是否已给出两个有效的整数,您可以检查scanf
函数的返回值(它成功地给出了字段数 扫描):
#include <stdio.h>
int main()
{
int i, j;
int result;
while (1) {
printf("type in two integers : ");
if (scanf("%d %d", &i, &j) != 2) break; // Break here if we didn't get two integers
if (i < j) {
result = j - i;
}
else if (j < i) {
result = i - j;
}
printf("%d\n", result);
}
return 0;
}
请随时提出进一步的澄清和/或解释。
答案 1 :(得分:3)
丢弃if内包含break的无限循环的整个概念。
根据{{1}}的返回值(实际上就是它的设计目标)为循环创建条件。
scanf()
我可能实际上会使用#include <stdio.h>
int main()
{
/* always init everything */
int i=0, j=0;
int result=0;
printf("type in two integers : ");
while (2==scanf("%d %d", &i, &j))
{
if (i < j) {
result = j - i;
}
else /* removed second if, to have a meaningful result for i==j */
{
result = i - j;
}
printf("%d\n", result);
printf("type in two integers : ");
}
return 0;
}
和一个变量,该变量存储要在循环条件中使用的返回值do {...} while (...)
。我认为不必复制打印件会更优雅,但我将其与您的代码结构保持更近的距离。
有关您的代码的更多注释:
scanf()
的工作方式与您似乎想的不同;它是静态的,在运行时不会更改,因此不能在循环条件下使用sizeof()
,永远不可能达到b,因为while (sizeof(i)==4 || sizeof(j)==4){if (sizeof(i) == 4 || sizeof(j) == 4){/* a */} else {/* b */}
和while
的条件相同if
处于未定义状态并返回未初始化的值根据您的要求,这是“做一会儿”替代方案的建议:
i==j