C中的简单循环和字符串长度

时间:2016-02-01 16:56:53

标签: c input while-loop fgets

我很陌生C.在Visual Studio 2015中写道,我试图通过使用fgets安全地提示用户输入字符串。我想使用fgets获取字符串,检查字符串是否太长,并重新启动用户,直到他们输入一个好的字符串。这是我的代码

/*
* Nick Gilbert
* COS317 Lab 2 Task 2
*/
#include "stdafx.h"
int main()
{
    char str[10];
    int isValid = 0;
    while (isValid == 0) {
        printf("Please enter a password: ");
        fgets(str, 10, stdin);
        if (strlen(str) == 9 && str[8] != '\n') { //http://stackoverflow.com/questions/21691843/how-to-correctly-input-a-string-in-c
            printf("Error! String is too long\n\n");
            memset(&str[0], 0, sizeof(str));
        }
        else {
            printf(str);
            isValid = 1;
        }
    }
    printf("Press 'Enter' to continue...");
    getchar();
}

然而,当我运行它并输入一个错误的字符串时,多余的字符会自动输入下一个fgets!

enter image description here

如何解决此问题以执行我想要的操作?

2 个答案:

答案 0 :(得分:1)

如果fgets读入的字符串不以换行符结尾,请在循环中调用fgets直到它为止,然后再次提示用户。

    if (strlen(str) > 0 && str[strlen(str)-1] != '\n') {
        printf("Error! String is too long\n\n");
        do {
            fgets(str, 10, stdin);
        } while (strlen(str) > 0 && str[strlen(str)-1] != '\n') {
    }

此外,永远不要将第一个参数的变量传递给printf,特别是如果该变量的内容来自用户输入的数据。这样做会导致format string vulnerability

答案 1 :(得分:0)

试试这个:

#include "stdafx.h"
int main()
{
    char str[10];
    int isValid = 0;
    while (isValid == 0) {
        printf("Please enter a password: ");
        fgets(str, str, stdin);
        if (strlen(str) == 9 && str[8] != '\n') { //http://stackoverflow.com/questions/21691843/how-to-correctly-input-a-string-in-c
            printf("Error! String is too long\n\n");
            memset(str, 0, sizeof(str));
        }
        else {
            printf("%s",str);
            isValid = 1;
        }
    }
    printf("Press 'Enter' to continue...");
    getchar();
}

另外:

使用memset()时,您可以直接使用array_name而非&array_name[0]