【问题标题】:Why does my program ignore arguments after #?为什么我的程序会忽略 # 之后的参数?
【发布时间】:2014-01-18 20:23:42
【问题描述】:

我正在学习 Zed Shaw 的“Learn C The Hard Way”(LCTHW),今天我正在学习 exercise 14Exercise 14 是一个简单的程序,它打印您在运行程序时给出的每个参数的字符的 ASCII 码。你可以查看我的代码here(请原谅随机的 cmets;我使用这个 repo 只是为了存储我的 LCTHW 笔记)。

我的程序没有完全按预期运行。我正在使用 OSX 上的终端调用该程序,并且该程序运行良好,直到我使用以“#”开头的参数运行它 - 该参数被忽略,以及之后的任何参数。例如,在终端中运行以下命令:

./ex14 Hello Simon #num53 okay 

将仅提供 Hello Simon 的 ASCII 代码,但不提供 #num53 或好的,即 -

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 复制到下面没有我的笔记 cmets -

#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;
}

【问题讨论】:

  • # 是许多 shell 的注释,因此 shell 可能会忽略包括# 之后的任何内容,并且不会将其传递给您的程序。
  • +1 用于提供 SSCCE。
  • 谢谢沙菲克。你的解释是正确的。对于 % 等其他字符,不会出现同样的问题。该终端接受 ...#... 但只通过 ...# 似乎是正确的:)

标签: c terminal


【解决方案1】:

'#' - 忽略该参数,以及后面的任何参数。

大多数 UNIX shell 将#(以及它之后的所有内容)视为注释字符。你的程序永远不会收到这些参数——它们会被 shell 删除。

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

【讨论】:

  • 仅引用有问题的 # 字符也可能有效:./ex14 \#num53
猜你喜欢
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多