我编写了一个小程序,它从*argv []
中获取一些输入参数并将它们打印出来。 在几乎所有使用情况下,我的代码都可以很好地工作。 仅当我在要传递为参数的字符串末尾使用超过一个感叹号时才会出现问题...
这个是有效的:
./program -m "Hello, world!"
这样做是不起作用的:
./program -m "Hello, world!!!!"
^^ 如果我这样做,程序的输出要么是那个字符串的两倍,要么是我输入 ./program 命令之前的命令。
但是,我绝对不理解的是:以下内容竟然可以工作:
./program -m 'Hello, world!!!!'
^^ 输出与输入相同,不包含任何额外的空格或换行符。
Hello, world!!!!
... 就像预期的那样。
所以,我的问题是:
- 为什么在一个字符串中使用多个感叹号时会出现奇怪的行为?
- 据我所知,在C语言中您使用
“”
表示字符串,使用''
表示单个字符。那么,为什么当我按照我的理解应该使用“”
时,使用''
可以得到所需的结果,而不是使用“”
? - 我的代码有错误吗,或者我需要改变什么来能够输入任何字符串(无论使用多少标点符号)并准确地打印该字符串?
我的代码的相关部分:
// this is a simplified example that, in essence, does the same
// as my (significantly longer) code
int main(int argc, char* argv[]) {
char *msg = (char *)calloc(1024, sizeof(char));
printf("%s", strcat(msg, argv[2])); // argv[1] is "-m"
free(msg);
}
我已经尝试将argv[2]
的内容复制到一个char*
缓冲区中,并在其末尾添加了一个'\0'
,但这并没有改变任何内容。
printf("%s", strcat(msg, argv[2]))
,而不是printf("%s", argv[2]))
? - Jabberwockycalloc()
在这里没有太多意义。只使用char msg[1024]
就非常好了。当你使用单引号时,字符串会原封不动地传递。这与argv
或 [tag:c] 编程语言无关,而是与 shell 相关。 - Iharob Al Asimibash
)的一个特殊字符。如果它不被放在单引号内,shell会解释!!
并将其替换为其他内容(历史记录中的上一个命令)。你的程序工作正确,它打印出从命令行接收到的内容。 - axiacargc
是否具有有效长度并检查参数是否合理,然后可能显示带有使用信息的错误消息。 - vgru