使用 argv 读取特定字母,然后将其用于开关(C 程序)

Read a specific letter using argv then using that for a switch (C Program)

这是作业

这与我的 post 之一有点重复,但我在读取命令行时遇到问题。我必须按字母顺序排列行星,这是一项简单的任务,但是让我的程序读取命令行参数然后将其用于我的开关是问题所在。我会 post 我的程序,然后再详细介绍。


#include<stdio.h>
#include<string.h>

void alpha(char planet[][9], char tempo[9]){
    int i, j;

     for(i=0;i<=9;i++)
      for(j=i+1;j<=9;j++){
         if(strcmp(planet[i],planet[j])>0){
            strcpy(tempo,planet[i]);
            strcpy(planet[i],planet[j]);
            strcpy(planet[j],tempo);
         }
      }
}
int main(int argc , char *argv[]){

   char str[][9] = {"Earth", "Jupiter", "Mars", "Mercury", "Neptune", "Pluto", "Saturn", "Uranus", "Venus"};
   char temp[9];

    if (argc == 3) {
    switch (argv[1][1]) { 


    case 'a':
    alpha(str, temp);
    printf("The planets in alphabetical order are:  ");
   for(int i=0;i<=9;i++)
      printf("%s, " , str[i]);
    printf("\n");

   return 0;
}
}
}

因此,为了让我的程序继续按字母顺序排列行星,我需要在 运行 程序之后输入命令 -o a。

所以它会是这样的:

./planets -o a

根据我的理解,if (argc == 3) 代码行读取输入字符的位置。那将跳过 -o 并且只关心命令行中的 a 。但是,这不起作用,我不知道为什么。此外,当我编译程序时,它在地球和金星之前有一个逗号。

所以它符合这样(不使用命令行部分):

,地球,......金星,

如何去掉 Earth 之前和 Venus 之后的逗号?

如有任何帮助,我们将不胜感激!

 ./planets    -o       a
 argv[0]   argv[1]   argv[2]

之前您通过 argv[1][1] 检查 o。这就是 switch 失败的原因。

此外,您还存在越界访问数组索引的未定义行为。

这就是改变

的原因
for(i=0;i<9;i++)

因为数组有9个元素。同样在第二个循环中for(j=i+1;j<9;j++)