c编程读取输入错误检查

时间:2017-11-18 01:25:31

标签: c error-handling

有没有办法让这个错误检查更好?还是有什么我忘记的?我期待一个整数然后字符串。我在代码中添加了建议。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>

int main(void) {
    // your code goes here
    char line[150] = {0};
    int sscanf_counter = 0;
    int num = 0;
    char string[150] = {0};
    char dummy; 

    while(fgets(line, sizeof line, stdin))
    {
        printf("line is %s\n", line);
        sscanf_counter = sscanf(line, "%d %s %c", &num, string, &dummy);
        printf ("sscanf_counter: %d\n", sscanf_counter);
        if (sscanf_counter == 2 && isalpha(string[0])) 
        {
            printf ("Good value: %d\n", num);
            printf ("string: <%s>\n", string);
        }
        else 
        {
            printf ("BAD VALUE: %d \n", num);
            printf ("string: <%s>\n", string);
        }
        memset(line, 0, sizeof line);
    }

    printf("Does this print? \n");

    return 0;
}

我不想将222转换为字符串,因此我在代码中添加了一个简单的isalpha()检查。我想要一个实际的数字作为我的第一个值和实际的字母字符而不是数字转换为字符串作为第二个值。

小调整输出:

aaa aaa
line is aaa aaa

sscanf_counter: 0
BAD VALUE: 0
string: <>
111 222
line is 111 222

sscanf_counter: 2
BAD VALUE: 111
string: <222>
111 aaa
line is 111 aaa

sscanf_counter: 2
Good value: 111
string: <aaa>

1 个答案:

答案 0 :(得分:1)

有没有办法让这个错误检查得更好?

溢出时未指定

docker stop container"%d"可以提供更强大的错误检查。

strtol()未检测到无关的额外输入。

要处理额外输入并仍使用"%d %s",请参阅下文。如果sscanf(),则检测到额外的非空白输入。

sscanf_counter == 3

测试char dummy; sscanf_counter = sscanf(line, "%d %s %c", &num, string, &dummy); 应该在之前使用变量

if (sscanf_counter == ...)

提示:在打印字符串时,请考虑可打印的声明以帮助检测前导/尾随空白问题。 (尽管 printf ("sscanf_counter: %d\n", sscanf_counter); if (sscanf_counter >= 1) printf ("num: %d\n", num); if (sscanf_counter >= 2) printf ("string: %s\n", string); 不期望这些。)

"%s"

OT:使用适应

的代码,而不是编码魔术数字
// printf ("string: %s\n", string);
printf ("string: <%s>\n", string);