C - Do while循环中的无限循环

时间:2017-09-26 17:31:25

标签: c for-loop while-loop boolean do-while

我需要循环一个循环直到它结束,但编译器继续循环,即使i> = = k并且我无法循环无限循环。这个片段有什么问题?

int i=0;
User signed_up[k]
char input_user[15];
bool stop_cycle=false;

do {
    printf("\n\n%*sUsername: ", 26, "");
    fflush(stdin);
    scanf("%s", input_user);
    stop_cycle=true;

    for (i=0;i<k;i++) {
        if (strcmp(input_user, signed_up[i].username)==0) {
            printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
        }
        stop_cycle=false;
    }
} while (!stop_cycle);

编辑:k是一个计数器,每次运行时子程序注册都会增加。在代码的这一点上它可以是0,1,等等。 我想要实现的是每次插入一个已经存在的用户名时再次插入它,直到数组中的搜索结束。

2 个答案:

答案 0 :(得分:1)

你到底想做什么?

您的代码采取的步骤在每次迭代中都将i变量重置为0,并且每次迭代都将stop_cycle设置为true和false。

每次迭代的for循环从i = 0到i <1。 ķ。

您可以通过每次将停止周期设置为false来结束此操作,因此while永远不会触发。

尝试将其作为:

运行
printf("\n\n%*sUsername: ", 26, "");
fflush(stdin);
scanf("%s", input_user);

for (i=0;i<k;i++) {
    if (strcmp(input_user, signed_up[i].username)==0) {
        printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
    }
}

int i=0;
User signed_up[k]
char input_user[15];
bool stop_cycle=true;

do {
    printf("\n\n%*sUsername: ", 26, "");
    fflush(stdin);
    scanf("%s", input_user);
    stop_cycle=true;

    for (i=0;i<k;i++) {
        if (strcmp(input_user, signed_up[i].username)==0) {
            printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
            stop_cycle=false;
        }
    }
} while (stop_cycle);

请注意停止循环变量的位置变化及其在第二个版本中的值。

答案 1 :(得分:0)

TL;博士

int i=0;
User signed_up[k];
char input_user[15];
bool stop_cycle=false;

do {
    printf("\n\n%*sUsername: ", 26, "");
    fflush(stdin);
    scanf("%s", input_user);
    stop_cycle=true;

    for (i=0;i<k;i++) {
        if (strcmp(input_user, signed_up[i].username)==0) {
            printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
            stop_cycle=false;
        }
    }
} while (!stop_cycle);

更长的解释

如果这是你的情况......

所以你想让他们输入一个用户名。

如果用户名存在,您想再次询问(输入不同的用户名),并打印“用户名inseritogiàpresentenel database!

您希望在用户输入不在“数据库”中的用户名之前继续这样做。

for循环的目的是测试用户名(input_user)是否已经在“数据库”中(即数组signed_up)。

变量kUser数组中signed_up个对象数的计数。

因此,for循环遍历signed_up数组中的所有值,以测试input_user是否匹配username对象的User成员在阵列中。

如果input_userusername的现有User匹配,则您希望继续在do while循环中循环。

stop_cycle设置为true将停止循环。

,然后...

您的问题是,您只想在stop_cycle=false;input_user匹配时设置username。这是停止循环的唯一时间(即stop_cycle=false;

错误是您将stop_cycle=false;置于if语句之外。它应该在if语句中。只要用户名已存在,这将继续“循环”。

所以这段代码可行:

int i=0;
User signed_up[k];
char input_user[15];
bool stop_cycle=false;

do {
    printf("\n\n%*sUsername: ", 26, "");
    fflush(stdin);
    scanf("%s", input_user);
    stop_cycle=true;

    for (i=0;i<k;i++) {
        if (strcmp(input_user, signed_up[i].username)==0) {
            printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
            stop_cycle=false;
        }
    }
} while (!stop_cycle);

其他建议

除了其他人的建议外,我的建议是:

stop_cycle重命名为username_exists,将k重命名为num_users

所以代码看起来像这样:

int i=0;
User signed_up[num_users];
char input_user[15];
bool username_exists=false;

do {
    printf("\n\n%*sUsername: ", 26, "");
    fflush(stdin);
    scanf("%s", input_user);
    username_exists=false;

    for (i=0;i<num_users;i++) {
        if (strcmp(input_user, signed_up[i].username)==0) {
            printf("\n%*sUsername inserito gi%c presente nel database!", 26, "", 133);
            username_exists=true;
        }
    }
} while (username_exists); 

这清楚表明您的for循环正在测试是否存在用户名,并且只要用户名存在,就会明确表示您的do循环将继续。它还清楚地表明k代表了用户数。