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 является двумерным массивом? Благодарю вас! - person itscharlieb; 12.02.2014
comment
Технически argv[0] may — это имя файла. См. stackoverflow.com/questions/2050961/ - person Peter M; 12.02.2014
comment
@itscharlieb Да, аргумент (даже только 1 символ) обрабатывается как массив символов. Питер М. Вы правы, я отредактировал свой ответ. - 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