我的老师要求我“防骗”我的代码,防止任何形式的误用,所以我想出了一个 可以删除任何空值的程序(通过完全禁止它们)
这是万无一失的代码
#include <stdio.h>
#include <conio.h>
int main()
{
char text[16];
printf("Type something: ");
fgets(text,16, stdin);
printf("You typed: %s",text);
getch();
}
我做了一些简单的调整以确保没有错误,但是,我无法让 if 过滤器正常工作,因为它仍然允许 NULL 输入
#include <stdio.h>
#include <conio.h>
int main()
{
char text[16];
int loop;
do
{
printf("Type something: ");
fgets(text,16, stdin);
if( text[0] == '\0')
{
printf("Try again");
system("cls");
loop=1;
}
else
{
loop = -1;
}
}
while(loop > 0);
printf("You typed: %s",text);
getch();
}
我尝试过谷歌,但无法得到可靠的答案,这可能是一些非常简单的代码行,但遗憾的是我不知道它是什么。
编辑:已修复,if 语句应该是:
if(文本[0]=='\n')
最佳答案
使用 fgets()
的返回值是防骗用户 I/O 的最佳第一步。
char text[16];
printf("Type something: ");
if (fgets(text, sizeof text, stdin) == NULL) {
if (feof(stdin)) Handle_stdin_is_closed(); // no more input
if (ferror(stdin) Handle_IOerror(): // very rare event, more common with files
}
// Test is input is is only a '\n'
if (text[0] == '\n')
printf("Try again");
// Look for long line.
size_t len = strlen(text);
if (len + 1 == sizeof text && text[len - 2] != '\n') HandleLongLine();
下一步是查找扫描错误。我们假设代码是读取一个long
。
errno = 0;
char *endptr;
long = strtol(text, &endptr, 10);
if (errno) Handle_NumericOverflow();
if (text == endptr) Handle_InputIsNotNumeric();
while (isspace((unsigned char) *endptr)) endptr++;
if (*endptr != '\0') Handle_ExtraTextAfterNumber();
尽管这是很多代码,但对恶意用户输入的稳健处理最好分离到可以进行大量测试的辅助函数中。
char * prompt = "Type something: ";
long number;
int stat = GetLong(stdin, prompt, &number); // put all tests in here.
if (stat > 0) Handle_SomeFailure();
if (stat < 0) Handle_EOF();
printf("%ld\n", number);
关于c - 如何删除 C 中的 NULL 输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26257944/