gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:17 26 4
gpt4 key购买 nike

我有下一个代码:

#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++ 中)

最佳答案

您制作了一个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(.........)

关于c - 如何改进 scanf 中的参数检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46630774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com