尝试编写一个在C

时间:2018-12-31 03:07:46

标签: c

我的错误是什么?我的代码应该获取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;}

5 个答案:

答案 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中删除了空格,除非您要扫描空格+您的号码)