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 语句似乎存在问题,该语句检查参数是否与任何行星不匹配,但仅当参数不符合此要求时才检查。
数组
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]是调用未定义的行为。
在它们之间添加逗号以进行修复。