Ответ 1
Слишком много * в этой строке:
**argv++;
Это должно быть так:
*argv++;
Плюс дополнительные брекеты, поскольку операция ++
имеет более высокий приоритет:
(*argv)++;
И он будет работать.
Я новичок в C и пытаюсь выяснить, что пошло не так с моим кодом кода за последние час или два. Я слежу за книгой K & Rs, и я продолжаю ее просматривать, но до сих пор не понимаю мою логическую ошибку.
while (*argv>0){
while (**argv>0){
printf("%c\n",**argv);
**argv++;
}
argv++;
}
Задача: Распечатайте все аргументы, которые подаются в мою программу, используя argv.
Насколько я понимаю, argv - это указатель на массив, содержащий дополнительные указатели на массивы указателей символов. Итак, я сказал, что while * argv > 0 или в то время как первый массив все еще имеет элементы, мы должны следовать указателям от первого массива до следующего массива. Затем мы должны распечатать все элементы в следующем массиве.
Слишком много * в этой строке:
**argv++;
Это должно быть так:
*argv++;
Плюс дополнительные брекеты, поскольку операция ++
имеет более высокий приоритет:
(*argv)++;
И он будет работать.
Я предлагаю вам не путать себя, используя разыменование указателя, как вы это делаете, когда нотация подстроки ([]
) позволяет вам сделать то же самое.
#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
, но обычно это недоверчиво, поскольку он открывает дверь для определенных атак с форматированием строк.
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;
}
это будет работать:
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
}