为什么此代码会因非行星命令行参数而失败?

1 c

我正在编写一个 C 程序的教科书示例,它将接受命令参数并确定它们是否是行星。这是我创建的代码:

#include <stdio.h>
#include <string.h>
#define NUM_PLANETS 9

void main(int argc, char *argv[]){
    char *planets[] = {"Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn"
                        "Uranus", "Neptune", "Pluto"};
    printf("Num args: %d\n", argc);
    
    int i, j;
    
    for(i = 1; i < argc; i++){
        //for every argument on the command line
        printf("arg: %d\n", i);
        for(j = 0; j < NUM_PLANETS; j++){
            //for every planet
            printf("j = %d\n", j); 
            if(strcmp(argv[i], planets[j]) == 0){
                //argument is a planet
                printf("%s is planet %d\n", argv[i], j + 1);
                break;
            }
        }
        printf("hello\n");
        //check planet status
        if(j == NUM_PLANETS){
            printf("%s is not a planet\n", argv[i]);
        }
        printf("hello\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

当给出.\planet.exe Jupiter Ted程序返回时:

Num args: 3
arg: 1
j = 0
j = 1
j = 2
j = 3
j = 4
Jupiter is planet 5
hello
hello
arg: 2
j = 0
j = 1
j = 2
j = 3
j = 4
j = 5
j = 6
j = 7
j = 8
Run Code Online (Sandbox Code Playgroud)

显然,程序到达 if 语句似乎存在问题,该语句检查参数是否与任何行星不匹配,但仅当参数不符合此要求时才检查。

Mik*_*CAT 7

数组

char *planets[] = {"Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn"
                    "Uranus", "Neptune", "Pluto"};
Run Code Online (Sandbox Code Playgroud)

只有以下8个元素:

"Mercury"
"Venus"
"Earth"
"Mars"
"Jupiter"
"SaturnUranus"
"Neptune"
"Pluto"
Run Code Online (Sandbox Code Playgroud)

因为没有逗号之间"Saturn",并"Uranus"因此它们被连接,并作为一个字符串字面处理。

出于这个原因,访问planets[8]是调用未定义的行为

在它们之间添加逗号以进行修复。