我有下一个代码:
#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 ++中)?
答案 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无效。