为什么 argv[1][0] 不是 '?' for 'a.out ?' 在 bash shell 中执行

Why is argv[1][0] not '?' for 'a.out ?' executed in a bash shell

为什么下面的?不显示帮助?换句话说,为什么 argv[1][0] 不是 '?'什么时候“a.out?”进入了吗?

文件pricePerGrmThc-v0.c

#include<stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
**printf("<%c>\n", argv[1][0]);**
    if(argc == 1 || argv[1][0] == '?' || argv[1][0] == 'h' || argv[1][0] == 'H'){
        printf("Usage:  %s <THC %-age> <GMs> <$s> [<TCH %-age> <GMs> <$s> [<TCH %-age> <GMs> <$s> ...\n", argv[0]);
        return(1);
    }
    if(argc%3 != 1){
        printf("must input 3n vars\n");
        return(2);
    }
    for(int i = 0; i < argc/3; i++){
        printf("%2.2f $/grOfThc\n", atof(argv[i * 3 + 3])  / (atof(argv[i * 3 + 2])  * atof(argv[i * 3 + 1])));
    }
    return(0);
}

执行 1

./a.out h

输出

<h>
Usage:  ./a.out <THC 0x0p+0ge> <GMs> <$s> [<TCH 0x0p+0ge> <GMs> <$s> [<TCH 0x0p+0ge> <GMs> <$s> ...

执行 2

./a.out ?

输出

<1>**
must input 3n vars

执行 3

./a.out ?est

输出

<?>
Usage:  ./a.out <THC 0x0p+0ge> <GMs> <$s> [<TCH 0x0p+0ge> <GMs> <$s> [<TCH 0x0p+0ge> <GMs> <$s> ...

您的 shell 将 ? 替换为当前目录中 one-character 长的文件名列表。

$ ls -1 
a
b
c
def

$ ls -1 ?
a
b
c

$ echo ?
a b c

$ echo ?ef
def

您需要使用某种形式的转义或引用。

$ echo \?
?

$ echo '?'
?

? 作为命令行参数,如果当前目录中有名称由单个字符组成的文件,则可以扩展。

另请注意,%-age 应写成 %%-agepercentage 以避免编译器警告和 运行 时的未定义行为。

%-a 需要一个 double 参数(未提供)并将其转换为 hex-float 格式,左对齐其自身宽度,如输出所示:0x0p+0