Основной указатель C

Я новичок в C и пытаюсь выяснить, что пошло не так с моим кодом кода за последние час или два. Я слежу за книгой K & Rs, и я продолжаю ее просматривать, но до сих пор не понимаю мою логическую ошибку.

while (*argv>0){
    while (**argv>0){
        printf("%c\n",**argv);
        **argv++;
    }
    argv++;
}

Задача: Распечатайте все аргументы, которые подаются в мою программу, используя argv.

Насколько я понимаю, argv - это указатель на массив, содержащий дополнительные указатели на массивы указателей символов. Итак, я сказал, что while * argv > 0 или в то время как первый массив все еще имеет элементы, мы должны следовать указателям от первого массива до следующего массива. Затем мы должны распечатать все элементы в следующем массиве.

Ответ 1

Слишком много * в этой строке:

**argv++;

Это должно быть так:

*argv++;

Плюс дополнительные брекеты, поскольку операция ++ имеет более высокий приоритет:

(*argv)++;

И он будет работать.

Ответ 2

Я предлагаю вам не путать себя, используя разыменование указателя, как вы это делаете, когда нотация подстроки ([]) позволяет вам сделать то же самое.

#include <stdio.h>

int main(int argc, char** argv)
{
    int i;
    for(i = 0; argv[i]; i++)
        printf("%s\n", argv[i]);
    return 0;
}

Это также напечатает argv[0], который является именем/контуром программы.

Теперь, что делает мой код? for(i = 0; argv[i]; i++) подсчитывает i от 0 до элемента, когда argv[i] переходит в false (т.е. 0 aka NULL), то есть последний элемент массива argv. И затем для каждого элемента массива он использует спецификатор формата %s для printf для его печати. Вы также можете передать argv[i] в качестве первого и единственного параметра в printf, но обычно это недоверчиво, поскольку он открывает дверь для определенных атак с форматированием строк.

Ответ 3

argv имеет тип char *argv[], то есть указатель на массив строк (char* 's). argv++ переходит к следующей строке массива.

Обычно эта функция записывается следующим образом:


int main(int argc, char *argv[]){
   int i;
   for (i = 0; i < argc; i++){ //loop from 0 to argc (argument count)
      printf("%s ", argv[i]);
   }
   return 0;
}


Ответ 4

это будет работать:

while(argc--)//can't use *argv here, because *argv would be the  address of the 
              // element which argv is pointing to, just by knowing the address u can't say whether it still has elements or not
{
    while( **argv )
    {
        printf("%c", **argv);
        (*argv)++;  //by using **argv++, you are actually moving argv to next array, not to the next character of current array 
    }
    argv++;
    printf("\n");//move your \n to here, else you will end up printing every character in a new line
}