c - 如何删除 C 中的 NULL 输入?

标签 c loops 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] == '\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/

相关文章:

java - 是否可以在没有 If 的情况下检查接收到的字段是否为空或 Null

c - 如何修改已传递给 C 函数的指针?

c - 如何在一次输入中获得多个值?(不确定性数量)

php - 将循环的 MySQL 数组存储为字符串变量

java - 使用 Java 将所有错误答案添加到数组中 - 如何?

go - 未初始化的 channel 如何表现?

c - 对数字数组求和但在运行时收到错误

通过mmap分配的内存是否可以覆盖数据段

loops - Swift 遍历字典数组

sql-server - MS SQL 2008 将 null 转换为字符串