我无法弄清楚如何使这段代码工作。假设是依赖于命令行给出的参数,它假设打印出问候语。
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]);
}
}
如果有人只输了他们的姓氏,那么终端会打印出来......
你好,last_name先生
...因为他们只提出了一个论点。这很好。
我被困的部分是给出的命令行参数是== 3
。如果给出3个参数,则终端要么打印出来......
嗨,last_name先生,你的考试成绩是test_score
...或...
我的名字是first_name last_name。
如果我在命令行参数中只输入姓氏和测试分数(Smith 3.4),那么它会打印出来(例如使用姓氏Smith)然后打印出来......
我的名字是Smith 3.4
但是,它确实适用于输入名字和姓氏(John Smith)。这给了......
我的名字是John Smith。
我不想要答案,我只想知道我做错了什么,并提示如何修复它。
答案 0 :(得分:3)
我不想要答案,我只想知道自己做错了什么,并提示如何解决问题。
问题1:您在初始化之前使用testscore
变量。
问题2:您没有使用atof
执行错误处理。我建议使用strtod()
。您可以使用它执行一些错误处理,以了解第三个参数是否为浮点数。您还可以创建自己的atof()
实现,如果有的话,它将转换并报告转换错误。
提示:尝试首先检查传递给c程序的参数数量。之后,尝试使用strtod()
或您自己的实现将第三个参数转换为float。如果成功转换,请将float convrsion的结果分配给test_score
并打印last_name
和testscore
。如果没有,则将第三个参数视为last_name
并打印first_name
和last_name
。
答案 1 :(得分:2)
你的问题在于这一行:
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 != '\0')
{
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]);
}
}
我没有测试代码,可能有更好的方法来检查命令行中的参数是&#34;数字&#34;。
答案 2 :(得分:0)
得到答案的人。要在不使用其他功能的情况下进行检查,它将是
...
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);
}
...