我很陌生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!
如何解决此问题以执行我想要的操作?
答案 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]
。