C: Отпечатване на елементи от *argv

Пиша C програма, която по избор приема въвеждане на знаци от командния ред. Ако потребителят въвежда знаци в командния ред, програмата трябва да отпечата ascii стойността на тези знаци. Срещам проблеми с 1) писане на оператора printf и 2) пропускане на отпечатване на входовете, ако потребителят не изпрати нищо от командния ред. Ето какво съм написал:

int main(int argc, char *argv){
    char thisChar; //Holds the character value of the current character.
    int ascii; //Holds the ascii value of the current character.
    int x = 1; //Boolean value to test if user input 0, our while loop break condition.
    int i = 0; //Counter for the following for loop

     if(argc > 0){
        for(i; i<argc; i++){
            thisChar = argv[i];
            printf("%c\nAscii: %d\n", thisChar, thisChar);//prints the character value of thisChar followed by its ascii value.
        }
        printf("Done.");
    }
}

Когато го извикам от командния ред така:

./ascii F G h

Резултатът е:

� 
k 
� 
� 
Done.

Проблемът в моя оператор printf ли е? И защо условието if се оценява като вярно, дори ако не изпратя вход?


person itscharlieb    schedule 12.02.2014    source източник
comment
а? int main(int argc, char *argv)   -  person this    schedule 12.02.2014


Отговори (3)


Прототипът е

int main(int argc,char *argv[]) // argv is an array of char pointers (= string)

Ако искате да отпечатате първия знак от низа, трябва да опитате нещо подобно:

int main(int argc,char *argv[]) {
  int i;
  char thisChar;
  for (i = 1; i < argc; i++) { // argv[0] may be the file name (no guarantee, see Peter M's comment)
    thisChar = argv[i][0]; // If the parameter is "abc", thisChar = 'a'
    printf("%c\tAscii: %d\n", thisChar, thisChar);
  }
  return 0;
} 
person Junior Dussouillez    schedule 12.02.2014
comment
Идеално, това решава проблема ми. Това означава ли, че всеки аргумент, подаден от командния ред, се третира като масив от знаци и като такъв argv е 2d масив? Благодаря ти! - person itscharlieb; 12.02.2014
comment
Технически argv[0] may е името на файла. Вижте stackoverflow.com/questions/2050961/ - person Peter M; 12.02.2014
comment
@itscharlieb Да, аргумент (дори само 1 знак) се третира като масив от знаци. Peter M Прав си, редактирах отговора си. - person Junior Dussouillez; 13.02.2014

Правилният прототип на main е main(int argc, char *argv[]), а не main(int argc, char *argv) (char **argv също работи). Вторият параметър е масив от символни указатели, всеки от които сочи към низ, представляващ един от токените в командния ред.

Ще трябва да преминете през всеки елемент от argv и за всеки един да преминете през символите (завършващи с нулев байт), като отпечатате всеки един.

Освен това argc винаги е поне 1, тъй като argv[0] е името на програмата.

person DoxyLover    schedule 12.02.2014

int main(int argc, char *argv[])

Параметърът argv е масивът от символен низ на всеки аргумент от командния ред, предаден на изпълним файл при изпълнение.

int main(int argc, char *argv[]){
   char thisChar; //Holds the character value of the current character.
   int i = 0; //Counter for the following for loop

   if(argc > 0){
      for(i; i<argc-1; i++){
         thisChar = *argv[i + 1];
         printf("%c\nAscii: %d\n", thisChar, thisChar);
      }
      printf("Done.");
   }
return 0;
}
person Sunil Bojanapally    schedule 12.02.2014