如何删除C中的NULL输入



我的老师要求我"防止"我的代码被任何形式的滥用,所以我想出了一个可以删除任何空值的程序(通过完全禁止它们)

这是非万无一失的代码

#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;
}

最新更新