strlen(*argv) дает необычный результат

Я запустил следующее просто для удовольствия, но не могу объяснить результат. Предположим, что ./test WTF? был запущен в командной строке, а полученный результат был WTF? 6 2. Почему такое огромное расхождение между сообщаемым значением argc (2 - как и ожидалось) и strlen(*argv), которое оказалось равным 6. Я знаю, что массив строк - это не совсем то, что ищет strlen, однако, Я думал, что значение, которое он производит (если он что-то производит), будет достаточно близко к argc. Мысли?

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(int argc, char**argv)
{
    for (int i = 1; i < argc; i++)
    {
        for (int j = 0; j < strlen(argv[i]); j++)
        {
            printf("%c", argv[i][j]);

        }
        printf(" ");
    }
    printf("\t%lu\t%d", strlen(*argv), argc);
    printf("\n");
}

person Ryan    schedule 14.07.2017    source источник
comment
Строка WTF? находится в argv[1].   -  person Eugene Sh.    schedule 14.07.2017
comment
argv[0] — это сама программа, в данном случае ./test. Однако вы не можете полагаться на это.   -  person Cody Gray    schedule 14.07.2017
comment
*argv равно ./test, то есть длиной 6 символов.   -  person Jean-Baptiste Yunès    schedule 14.07.2017
comment
argc — количество строк в argv. argv[0] — это имя вашей программы, в данном случае ./test, длина которой равна 6.   -  person Grifplex    schedule 14.07.2017
comment
*argv это argv[0]. Почему вы ожидаете какой-либо связи между argc и strlen(argv[0])? Это два совершенно не связанных между собой значения.   -  person AnT    schedule 14.07.2017
comment
./test мне кажется 6 символов.   -  person Lee Daniel Crocker    schedule 14.07.2017


Ответы (2)


Здесь нет ничего плохого. Массив argv содержит две строки —

  1. имя программы при вызове --> "./test"
  2. "ВТФ?".

Итак, в вашем примере strlen(argv[0]) напечатает 6, а strlen(argv[1]) напечатает 4.

person VHS    schedule 14.07.2017
comment
Правильно и понятно. То, что я не осознавал, я сделал с strlen(*argv), так это написал синоним для strlen(argv[0]). Спасибо за ответ! - person Ryan; 14.07.2017

Например, если вы запустите gcc -o myprog myprog.c в командной строке, вы получите следующее:

argc
4 
argv[0]
   gcc 
argv[1]
   -o 
argv[2]
   myprog 
argv[3]
   myprog.c

Следовательно, для вашего случая вы получите 6 (длина ./test для argv[0]) вместо 4 (длина WTF? argv[1]) при запуске ./test WTF? в командной строке.

person OmG    schedule 14.07.2017