Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c编程读取输入错误检查_C_Error Handling - Fatal编程技术网

c编程读取输入错误检查

c编程读取输入错误检查,c,error-handling,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};

有没有办法使这个错误检查更好?还是我忘记了什么?我希望是一个整数,然后是字符串。我将建议添加到代码中

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

有没有办法使这个错误检查更好

%溢出时未指定d。strtol可以提供更强的错误检查功能

%d%s未检测到无关的额外输入

要处理额外输入并仍使用sscanf,请参见下文。如果sscanf_计数器==3,则检测到额外的非空白输入

char dummy;
sscanf_counter = sscanf(line, "%d %s %c", &num, string, &dummy);
如果sscanf_计数器==。。。应该在使用变量之前发生

  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所期望的


为了获得更好的反馈,请发布使用的真实输入、看到的输出和预期的输出。@chux I更新了我的代码。我在代码中添加了isalpha检查的小调整。noobprogrammer1987 isalphastring[0]没有为字符串[0]的大多数负值定义。高度可移植的代码使用isalphaunsigned char string[0]@chux它甚至不具有高度可移植性,许多调试CRT在最常用的有符号char平台上;将直接断言为负值。@AnttiHaapala您能详细说明一下您在说什么吗?谢谢。我假设将虚拟对象添加到sscanf的末尾只是为了告诉我是否有额外的输入?它还有别的作用吗?你说的可打印的句子是什么意思?谢谢你的提醒。括号大小是否可选?第一次使用sizeof时没有括号,没有问题,我很惊讶。它不需要!=while循环结束时为NULL?@noobprogrammer1987 while fgetsline,sizeof line,stdin,while fgetsline,sizeof line,stdin!=空函数相同,按照组的编码样式编码。@noobprogrammer1987 sizeof对象编码与SizeOfoObject相同。对于type,必须使用sizeoftype。@noobprogrammer1987是的,dummy用于检测额外的输入。
  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);
// printf ("string: %s\n", string);
printf ("string: <%s>\n", string);
// memset(line, 0, 150);
memset(line, 0, sizeof line);

// while(fgets(line, 150, stdin) != NULL)
while (fgets(line, sizeof line, stdin))