我的应用程序基本上是一个shell,它需要cmd [x]
类型的输入,其中cmd
是常量,x
是可选的。因此cmd 1
本身是合法的,cmd
本身也是合法的 - 然后我假设x
的默认参数。
我这样做:
char cmd[64];
scanf("%s", cmd);
int arg;
scanf("%d", &arg); // but this should be optional
如何读取整数参数,如果提示中当前没有可用的参数,则将其设置为默认值?如果没有在原始命令中给出,我不希望提示等待其他输入。
我使用fgetc()
和getchar()
尝试了多个版本,并将它们与EOF
进行了比较,但无济于事。我尝试的每个版本最终都在等待可选的整数参数。
答案 0 :(得分:3)
简单方法:
char b[73]; //powers of 2 magic is evil.
if(fgets(b,sizeof b,stdin) != NULL) {
char cmd[59]; //59, no command will ever be > 58. Ever I say.
int arg;
if(sscanf(b,"%58s %d",cmd,&arg) == 2) {
//handle cmd and arg
} else if(sscanf(b,"%58s",cmd) == 1) {
//handle cmd only
} else {
// :-/
}
}
答案 1 :(得分:2)
简单回答,你不能。 C运行时从OS获取输入,但不控制它。要做这样的事情,您需要使用特定于平台的API直接与操作系统进行交互。
答案 2 :(得分:1)
你在逐行阅读吗?在你到达“\ n”(换行符)之前,你不能只读完整个命令吗?如果你在换行符之前得到两个令牌,那就是命令和参数;如果你只读一个,它只是命令,你将第二个参数设置为默认值。
答案 3 :(得分:0)
这是一个有效的程序(对不起,我之前的回答是急速的)。
int main(){
char cmd[100], line[100];
int man = 0;
printf("OK: ");
fgets(line, 100, stdin);
int num = sscanf(line,"%s %d",cmd,&man);
if (num==1)printf("one! %s %d\n", cmd, man);
else if (num==2)printf("two! %s %d\n", cmd, man);
}
fgets读取行(带边界检查),sscanf将评估是否输入了一个或两个令牌。