我正在经历Zed Shaw的'艰难学习C'(LCTHW),今天我正在做exercise 14。 Exercise 14是一个简单的程序,它打印运行程序时给出的每个参数的字符的ASCII代码。您可以查看我的代码here(请原谅随机评论;我只使用此代表存储我的LCTHW备注)。
我的程序没有完全按预期运行。我在OSX上使用Terminal来调用程序,程序运行得非常好,直到我使用以'#'开头的参数运行它 - 该参数被忽略,以及之后的任何参数。例如,在终端中运行以下命令:
./ex14 Hello Simon #num53 okay
将仅提供Hello Simon的ASCII代码,但不提供#num53或okay,即 -
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;
}
答案 0 :(得分:8)
'#' - 该参数被忽略,以及之后的任何参数。
大多数UNIX shell将#
(及其后的所有内容)视为注释字符。你的程序永远不会收到这些参数 - 它们会被shell删除。
尝试./ex14 '#num53'
(即引用参数)。