我的老师要求我"防止"我的代码被任何形式的滥用,所以我想出了一个可以删除任何空值的程序(通过完全禁止它们)
这是非万无一失的代码
#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] == ' ')
{
printf("Try again");
system("cls");
loop=1;
}
else
{
loop = -1;
}
}
while(loop > 0);
printf("You typed: %s",text);
getch();
}
我试过谷歌,但我无法得到一个可靠的答案,这可能是一些非常简单的代码行,但遗憾的是,我不知道它是什么。
编辑:它是固定的,if语句应该是:
if(text[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 != ' ') 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("%ldn", number);
fgets
将包括换行符在内的整行读取到缓冲区中,并0终止它。
如果它读取了一些内容,然后流结束,则读取的行将没有换行符
如果该行不合适,则不会包含换行符
如果在成功读取第一个字符之前发生错误,则返回NULL
。
请阅读fgets
的手册页:http://man7.org/linux/man-pages/man3/fgets.3.html
根据fgets()
手册页
char *fgets(char *s, int size, FILE *stream);
//fgets() returns s on success, and NULL on error or when end of file
//occurs while no characters have been read.
因此,您可以检查fgets()
的返回值
n = fgets(text,16, stdin);
如果该值是NULL
,则没有读取任何内容。
您可以通过在for循环中检查n
的值来实现这一点
if( n == NULL)
{
printf("Try again");
system("cls");
loop=1;
}
else
{
loop = -1;
}