我的错误是什么?我的代码应该获取stop的值,然后当x小于或等于stop(y)时,它应该运行while循环。如果是偶数,基本上会打印x,如果是奇数,它将继续循环。
int main(void){
int x = 1;
int y;
printf("What number should I count to?: ");
scanf(" %d", y);
while(x<=y){
if(x % 2 != 0){
x++;
continue;
}
printf(" %d, ", x);
}
return 0;}
答案 0 :(得分:2)
正如其他人所指出的那样,您的scanf
呼叫是错误的,应该像这样使用&y
scanf("%d", &y);
但是,没有人注意到您可以显着提高循环效率。我不会在循环中测试偶数 ,而是在循环前执行一次,如果奇数是奇数,则将初始值递增(强制为偶数初始条件)。然后,您可以在循环内增加2,而无需再次测试。喜欢,
if (x % 2 != 0) {
x++;
}
while (x <= y) {
printf("%d, ", x);
x += 2;
}
答案 1 :(得分:1)
&y
中需要scanf
,因为scanf
需要指向y
的指针。否则,您将遇到段错误。
此外,您只为奇数增加x
,所以您将陷入无限循环,因为一旦您碰到偶数,就再也不会增加x
。
这是清理代码[请原谅免费的样式清理]:
#include <stdio.h>
int
main(void)
{
int x = 1;
int y;
printf("What number should I count to?: ");
scanf(" %d", &y);
for (; x <= y; ++x) {
if ((x % 2) != 0)
continue;
printf(" %d, ", x);
}
return 0;
}
更新:
我以前从未见过for循环,其中第一部分为空,这意味着什么?
for
循环的一般形式为:
for (initialization_expr; condition_expr; iteration_expr)
任何或所有这些子表达式都可以消除(即空白)。
例如,我们可以替换:
while (1)
使用:
for (;;)
我个人更喜欢while
,但是有些人将for
用作“永远”的循环[它们都一样快]。
基本上,我们可以省略我们希望的任何一个。这是一个永久循环,每次迭代都会使x
递增:
for (x = 1; ; ++x)
假设我们更改程序,以便首先输出偶数,但是然后添加一个循环,该循环输出从开始的奇数,其中偶数停止:
#include <stdio.h>
int
main(void)
{
int x = 1;
int y;
printf("What number should I count to?: ");
scanf(" %d", &y);
// output even numbers
printf("Even:");
for (; x <= y; ++x) {
if ((x % 2) != 0)
continue;
printf(" %d, ", x);
}
printf("\n");
// increase limit
y *= 2;
// output odd numbers
printf("Odd:");
for (; x <= y; ++x) {
if ((x % 2) == 0)
continue;
printf(" %d, ", x);
}
printf("\n");
return 0;
}
另一个例子是解析一个句子。请注意,两个for
循环不能具有初始化程序:
#include <stdio.h>
#include <string.h>
int
main(void)
{
char buf[1000];
char token[1000];
char *src;
int stop;
char *dst;
printf("Enter sentence: ");
fflush(stdout);
fgets(buf,sizeof(buf),stdin);
src = strchr(buf,'\n');
if (src != NULL)
*src = 0;
src = buf;
while (1) {
// find non-blank
for (; *src != 0; ++src) {
if (*src != ' ')
break;
}
if (*src == 0)
break;
switch (*src) {
case '"': // handle quoted string
case '\'':
stop = *src;
++src;
break;
default: // handle token
stop = ' ';
break;
}
dst = token;
for (; *src != 0; ++src, ++dst) {
if (*src == stop)
break;
*dst = *src;
}
*dst = 0;
printf("token: '%s'\n",token);
if (*src == 0)
break;
++src;
}
return 0;
}
答案 2 :(得分:0)
您对y
的输入是错误的:
scanf(" %d", y);
应该是
scanf(" %d", &y);
答案 3 :(得分:0)
使用
<svg>
代替:
scanf(" %d", &y);
答案 4 :(得分:0)
您应该拥有scanf(" %d", y);
(而不是scanf("%d", &y);
(在scanf中删除了空格,除非您要扫描空格+您的号码)