命令行参数
Command Line Argument
我无法弄清楚如何使这段代码工作。假设是根据命令行给出的参数,它应该打印出问候语。
int main (int argc, char *argv[]) {
double testscore;
if (argc == 2) {
printf("Hello, Mr.%s.\n", argv[1]);
}
else if (argc == 3 && argc == testscore) {
testscore = atof(argv[2]);
printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore);
}
else {
printf("My name is %s %s.\n", argv[1], argv[2]);
}
}
如果有人只输入他们的姓氏,那么终端会打印出...
Hello, Mr. last_name
...因为他们只提出了一个论点。这很好用。
我卡住的部分是当给出的命令行参数是 == 3
时。如果给出 3 个参数,那么终端应该打印出...
Hi, Mr. last_name, your test score is test_score
...或...
My name is first_name last_name.
如果我在命令行参数中只输入姓氏和考试分数 (Smith 3.4),那么它会打印出来(例如使用姓氏 Smith)然后它会打印出来...
My name is Smith 3.4
但是,它确实适用于输入名字和姓氏 (John Smith)。这给...
My name is John Smith.
我不想要答案,我只想要我做错了什么并提示如何修复它。
你的问题出在这一行:
else if (argc == 3 && argc == testscore) {
事实上,当 argc == 3 时,您要检查 argv[2] 是否为数字参数。
else if ( (argc==3) && (is_numeric_arg(argv[2])==1)) {
一个可能的实现是:
int is_numeric_arg(char* arg)
{
int isInt = 0;
int isFloat = 0;
int isChar = 0;
char* currChar;
int i = 0;
currChar = arg;
isInt = 1;
while (*currChar != '[=12=]')
{
if(*currChar < '0' || *currChar > '9')
{
if(*currChar == '.' && isInt == 1)
{
isInt = 0;
isFloat = 1;
}
else
{
isInt = 0;
isChar = 1;
}
}
currChar++;
}
if (isChar == 1){ return 0; } // argument is a string
else { return 1; } // argument is a int or float
}
int main (int argc, char *argv[]) {
double testscore;
if (argc == 2) {
printf("Hello, Mr.%s.\n", argv[1]);
}
else if ( (argc==3) && (is_numeric_arg(argv[2])==1)) {
testscore = atof(argv[2]);
printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore);
}
else {
printf("My name is %s %s.\n", argv[1], argv[2]);
}
}
我没有测试代码,可能有更好的方法来检查命令行中的参数是否为 "numeric"。
I do not want the answer, I just want what I am doing wrong and hints on how to fix it.
问题 1:您在 testscore
变量初始化之前使用它。
问题 2:您没有使用 atof
执行错误处理。我建议使用 strtod()
。您可以使用它执行一些错误处理以了解第三个参数是否为浮点数。您还可以创建自己的 atof()
实现,它将转换并报告转换错误(如果有)。
提示:首先尝试检查传递给c程序的参数数量。之后,尝试使用 strtod()
或您自己的实现将第三个参数转换为浮点数。如果转换成功,将float转换的结果赋值给test_score
并打印last_name
和testscore
。如果不是,则将第三个参数视为 last_name
并打印 first_name
和 last_name
.
伙计们,知道答案了。要在不使用其他功能的情况下检查它,它将是
.....
else if ( argc==3 && sscanf(argv[2], "%f", testscore)
{
testscore = atof(argv[2]);
printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore);
}
...
我无法弄清楚如何使这段代码工作。假设是根据命令行给出的参数,它应该打印出问候语。
int main (int argc, char *argv[]) {
double testscore;
if (argc == 2) {
printf("Hello, Mr.%s.\n", argv[1]);
}
else if (argc == 3 && argc == testscore) {
testscore = atof(argv[2]);
printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore);
}
else {
printf("My name is %s %s.\n", argv[1], argv[2]);
}
}
如果有人只输入他们的姓氏,那么终端会打印出...
Hello, Mr. last_name
...因为他们只提出了一个论点。这很好用。
我卡住的部分是当给出的命令行参数是 == 3
时。如果给出 3 个参数,那么终端应该打印出...
Hi, Mr. last_name, your test score is test_score
...或...
My name is first_name last_name.
如果我在命令行参数中只输入姓氏和考试分数 (Smith 3.4),那么它会打印出来(例如使用姓氏 Smith)然后它会打印出来...
My name is Smith 3.4
但是,它确实适用于输入名字和姓氏 (John Smith)。这给...
My name is John Smith.
我不想要答案,我只想要我做错了什么并提示如何修复它。
你的问题出在这一行:
else if (argc == 3 && argc == testscore) {
事实上,当 argc == 3 时,您要检查 argv[2] 是否为数字参数。
else if ( (argc==3) && (is_numeric_arg(argv[2])==1)) {
一个可能的实现是:
int is_numeric_arg(char* arg)
{
int isInt = 0;
int isFloat = 0;
int isChar = 0;
char* currChar;
int i = 0;
currChar = arg;
isInt = 1;
while (*currChar != '[=12=]')
{
if(*currChar < '0' || *currChar > '9')
{
if(*currChar == '.' && isInt == 1)
{
isInt = 0;
isFloat = 1;
}
else
{
isInt = 0;
isChar = 1;
}
}
currChar++;
}
if (isChar == 1){ return 0; } // argument is a string
else { return 1; } // argument is a int or float
}
int main (int argc, char *argv[]) {
double testscore;
if (argc == 2) {
printf("Hello, Mr.%s.\n", argv[1]);
}
else if ( (argc==3) && (is_numeric_arg(argv[2])==1)) {
testscore = atof(argv[2]);
printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore);
}
else {
printf("My name is %s %s.\n", argv[1], argv[2]);
}
}
我没有测试代码,可能有更好的方法来检查命令行中的参数是否为 "numeric"。
I do not want the answer, I just want what I am doing wrong and hints on how to fix it.
问题 1:您在 testscore
变量初始化之前使用它。
问题 2:您没有使用 atof
执行错误处理。我建议使用 strtod()
。您可以使用它执行一些错误处理以了解第三个参数是否为浮点数。您还可以创建自己的 atof()
实现,它将转换并报告转换错误(如果有)。
提示:首先尝试检查传递给c程序的参数数量。之后,尝试使用 strtod()
或您自己的实现将第三个参数转换为浮点数。如果转换成功,将float转换的结果赋值给test_score
并打印last_name
和testscore
。如果不是,则将第三个参数视为 last_name
并打印 first_name
和 last_name
.
伙计们,知道答案了。要在不使用其他功能的情况下检查它,它将是
.....
else if ( argc==3 && sscanf(argv[2], "%f", testscore)
{
testscore = atof(argv[2]);
printf("Hi, Mr.%s, your score is %.1f\n", argv[1], testscore);
}
...