2015-02-08 2 views
0

Я понимаю, что аргументы командной строки указываются указателями на строки в массиве argv []. т. е. argv [0] содержит указатель на имя программы, а argv [1] - указатель на самый первый аргумент командной строки.истинные свойства аргумента аргумента командной строки argv

Но я заметил совсем другое приложение argv в Интернете и написано ниже. Я скомпилировал его успешно и распечатал второй аргумент третьего символа.

#include <stdio.h> 
    int main(int argc , char *argv []) {   
     printf("%c\n", argv [1][2]);     
     return 0; } 

У меня есть два вопроса, возникающих из-за этого использования.

Какое истинное измерение argv? он останавливается на два или больше?

Я заметил код, который программатор использовал% c для доступа и печати заостренного содержимого. Теперь мы всегда можем разобрать указатель (указатель строки) на% s и ожидать, что он будет распечатывать набор символов до нулевого терминатора.

до моего лучшего понимания% c может использоваться только в том случае, если в массиве он содержит символ.

т.е.

char yadhavan [] = yadhavan is a boy; 
printf ("%c", yadhavan [3]); 

Может кто-то пожалуйста, объясните, как% с используется с массивом указателей?

Немного больше объяснений всегда более чем приветствуется!

+0

Я запретили задавать больше вопросов задавать этот вопрос ?? – Qwertylicious

ответ

1

Каково истинное измерение argv?он останавливается на два или больше?

argc указывает количество аргументов (или размер argv, как вы выразились). Другими словами, количество строк в argv равно argc. Таким образом, argv может содержать более двух строк, если предусмотрено несколько аргументов. Например, если бы я, чтобы выполнить какую-либо команду, как

$ foo file1 file2 ... 

argv будет выглядеть

argv[0] = "foo\0" 
argv[1] = "file1\0" 
argv[2] = "file2\0" 
... 

См this other answer для более подробной информации о argc против argv.

Не могли бы вы объяснить, как% c использовался с массивом указателей?

Во-первых, %s используется для печати строк. %c используется для печати одного символа. Во-вторых, argv - это массив строк, а строка - это просто массив символов (char). Итак, argv действительно представляет собой массив массивов символов. Итак, когда вы видите

printf("%c\n", argv[1][2]); 

код распечатки третьего символа второго аргумента в argv. Так, если бы я, чтобы выполнить команду

$ foo bar 

argc и argv будет выглядеть

argc = 2 
argv[0] = "foo\0" 
argv[1] = "bar\0" 
argv[1][0] = 'b' 
argv[1][1] = 'a' 
argv[1][2] = 'r' 
argv[1][3] = '\0' // null terminator 
2

argv имеет тип char*[] и содержит несколько строк (аргументы командной строки).
argv[i] имеет тип char* и содержит строку.
argv[i][j] имеет тип char и содержит символ.

Какое истинное измерение argv? Остановится ли он на двух или больше?

Это зависит от того, сколько аргументов командной строки есть.

Может кто-нибудь объяснить, как %c был использован с массивом указателей?

Можно объявить char указатели и сделать их указывают на строки или просто использовать char массив и удерживайте строку:

char* str="string"; 

Или

char str[]="string"; 

В обоих этих способов является можно передать символ, используя:

printf("%c",str[3]); 

argv фактически представляет собой массив char*. Таким образом, можно отнести к нему один символ.

+0

как запрос argv [i] [j] вдруг заставит массив указателей вести себя как массив символов? – Qwertylicious

+0

'argv [i] [j]' не является указателем или массивом 'char'. Это 'char'. –

+0

, но argv был определен мной как массив указателей в начале моего кода. Как он стал массивом символов? im немного запутался здесь. – Qwertylicious

0

полукокса * ARGV [] является массивом указателей, и это действует как массив в два Dimention, он может» t содержит больше 2D. Таким образом, данные в «argv» очень похожи на 2D, но ограничения не указаны. Вы можете проверить в ссылке ниже: Limit on the number of arguments to main in C

#include <stdio.h> 
    int main(int argc , char *argv []) {   
    printf("%c\n", argv [1][2]);     
    return 0; } 

Здесь символ * ARGV [] очень похож на

Char argv[][] //with no argument limitation.