Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的程序会忽略#之后的参数?_C_Terminal - Fatal编程技术网

C 为什么我的程序会忽略#之后的参数?

C 为什么我的程序会忽略#之后的参数?,c,terminal,C,Terminal,我正在读Zed Shaw的《艰苦学习C》(LCTHW),今天我正在做。是一个简单的程序,它打印运行程序时给出的每个参数的字符的ASCII码。您可以查看我的代码(请原谅随机评论;我使用此回购仅用于存储我的LCTHW注释) 我的程序没有完全按照预期运行。我在OSX上使用Terminal调用程序,该程序工作得非常出色,直到我使用以“#”开头的参数运行它——该参数以及之后的任何参数都会被忽略。例如,在终端中运行以下命令: ./ex14 Hello Simon #num53 okay 将仅为Hello

我正在读Zed Shaw的《艰苦学习C》(LCTHW),今天我正在做。是一个简单的程序,它打印运行程序时给出的每个参数的字符的ASCII码。您可以查看我的代码(请原谅随机评论;我使用此回购仅用于存储我的LCTHW注释)

我的程序没有完全按照预期运行。我在OSX上使用Terminal调用程序,该程序工作得非常出色,直到我使用以“#”开头的参数运行它——该参数以及之后的任何参数都会被忽略。例如,在终端中运行以下命令:

./ex14 Hello Simon #num53 okay 
将仅为Hello Simon提供ASCII代码,但不为#num53或okay提供ASCII代码,即-

LCTHW-sols $ ./ex14 Hello Simon #num53 okay
Hello has 5 chars
'H' == 72 'e' == 101 'l' == 108 'l' == 108 'o' == 111 
--------------
Simon has 5 chars
'S' == 83 'i' == 105 'm' == 109 'o' == 111 'n' == 110 
--------------
为什么会这样?此外,如何更改代码以使其接受任何参数

ex14.c在没有注释的情况下复制了以下内容-

#include <stdio.h>
#include <ctype.h> // Functions to classify and transform chars
#include <string.h> // for strlen()

void print_letters(char arg[]);

void print_arguments(int argc, char *argv[])
{
        int i = 0;

        for(i = 1; i < argc; i++) { 
                 print_letters(argv[i]);
        }
} // end print_arguments

void print_letters(char arg[])
{
        printf("%s has %lu chars\n", arg, strlen(arg));
        int i = 0;
        for(i = 0; arg[i] != '\0'; i++) {
                char ch = arg[i];

                // Shouldn't differ the print_arguments loop
                if(isalpha(ch) || isblank(ch) || isdigit(ch)) {
                        printf("'%c' == %d ", ch, ch);
                }
        }

        printf("\n--------------\n");
}

int main(int argc, char *argv[])
{
        print_arguments(argc, argv);
        return 0;
}
#包括
#包含//用于分类和转换字符的函数
#包括//用于strlen()
无效打印字母(字符参数[]);
无效打印参数(int argc,char*argv[])
{
int i=0;
对于(i=1;i
“#”-该论点以及之后的任何论点都被忽略

大多数UNIX shell将
#
(及其后的所有内容)视为注释字符。您的程序从不接收这些参数——它们被shell删除


请尝试
/ex14'#num53'
(即引用参数)。

#
是许多shell的注释,因此shell可能会忽略包含
#
之后的任何内容,而不会将其传递给您的程序。+1感谢您提供了SSCE。谢谢Shafik。你的解释是正确的。对于其他字符,例如%,不会出现相同的问题。该终端接受…#。。。但是只有通过…#似乎是正确的:)只引用冒犯的#字符也可能有效:./ex14\#num53