如何改进scanf中的参数检查?

时间:2017-10-08 11:49:58

标签: c types scanf

我有下一个代码:

#include <stdio.h>
int main(){
    char* a;
    int b;
    if(fscanf(stdin,"%s%d",a,&b)!=2){
        printf("Bad Args!!");
    }
  return 0;
}

当我尝试添加下一个输入时 -

F52352354

5F2352354

我得到下一个输出

第一个 - Bad Arg

对于第二个 Nothing

另一件令人烦恼的事情是,当我尝试检查大数字然后int的范围并且在double的范围内我得到输入就可以了。

我的问题是,是否有一种优雅的方法来检查参数(在C而不是在C ++中)

2 个答案:

答案 0 :(得分:2)

你做了一个char指针。但它只是一个指针而不是一个数组。

如果你使用一个未初始化的指针,它有一些不确定的(垃圾)值,它指向某个位置,甚至可能不是程序被允许访问的位置,或者更糟糕的是它可能指向另一个进程的内存反过来导致错误。

使用动态内存分配,如

char *a=malloc(sizeof(char)*100);
if(a==NULL)
{
    perror("Not enough space");
}

,必须在使用free(a)后解除分配。

或者创建一个静态分配的数组,如

char a[100]; 

您似乎期望读取字符串然后读取数字。如果输入是不带数字的字符串,然后是数字,则可以使用

scanf("%99[^0-9]%d", a, &b);

scanf()最多可以读取99个字符,直到遇到一个数字,将其放在a中,并且该数字会存储在b中。

正如@David指出的那样,这不会跳过前导空格。如果您想在写入a之前跳过前导空格,请在%99[^0-9]之前使用空格

scanf(" %99[^0-9]%d", a, &b);

检查scanf()的返回值,看看scanf()是否成功。

请注意,如果scanf()失败,某些字符仍将保留在输入缓冲区中,您可能希望将其删除。

你可以这样做,从输入缓冲区消耗到下一个\n

int ch;
while( (ch=getchar())!='\n' && ch!=EOF );

fscanf(stdin, ........)相当于scanf(.........)

答案 1 :(得分:0)

我认为你至少有两个问题。 a是指向char的指针,但scanf需要一个char数组。此外,%s将在输入完成或空格之前获得尽可能多的字符,因此使用%d跟随它意味着%s将获得所有输入并且%d无效。