Как найти длину argv [] в C

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main(int argc, char *argv[]){
        int fir; //badly named loop variable
        char *input[] = calloc( strlen(argv), sizeof(char)); //initializing an array
        for( fir = 1; fir< strlen(argv); fir++){ //removing the first element of argv
            strcat(input, argv[fir]); // appending to input
            }

Ошибка, которую я получаю, относится к строке 6. она говорит "передавая аргумент 1 из" strlen "из несовместимого типа указателя. Я получаю ту же ошибку для функции strcat. Он также говорит, что с учетом char **, но ожидал const char * для обеих функций. Я пытаюсь заполнить новый массив всеми элементами argv, кроме первого. Я попробовал argv = & argv [1], и это не сработало. функции strlen() и strcat() не принимают char массивы?

Ответ 1

int main(int argc, char *argv[])

argv - это массив указателей на char (т.е. массив строк). Длина этого массива хранится в аргументе argc.

strlen предназначен для извлечения длины одной строки, которая должна быть с нулевым завершением, иначе поведение undefined.

Ответ 2

Не знаю, почему никто не предложил изменить strlen, чтобы ссылаться на определенную запись в массиве указателей на char?

 strlen(argv[0])     // also, 1, 2, up to (argc - 1)

Кроме того, http://www.cdecl.org/ помогает подтвердить, что инструкция char *argv[]: declare argv as array of pointer to char

Ответ 3

argv - это массив из char*. Размер этого массива argc. Вы должны передать элемент этого массива в strlen.

Ответ 4

Возможно, вы хотели сделать что-то вроде этого:

size_t argv_length(char** argv)
{
    size_t ret = 0;
    while( *(++argv) )
        ret += strlen(*argv);

    return ret;
}

?

Ответ 5

argv берет arryas char *, но вам нужно передать argc в strlen, а не весь массив. Тогда вы не получите никакой ошибки в strcat.

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
int fir; //badly named loop variable
char *input[] = calloc( strlen(argc), sizeof(char)); //initializing an array
for( fir = 1; fir< strlen(argv); fir++){ //removing the first element of argv
 strcat(input, argv[fir]); // appending to input
}

Ответ 6

argv - это массив из char, strlen принимает только строки. Если вы хотите получить длину каждого аргумента в argv (это то, что я пытаюсь сделать), вы должны выполнить итерацию через него, обращаясь к таким элементам argv[i][j]. Использование аргумента argv[i][j] != '\0'. Если вы просто хотите, чтобы количество аргументов использовалось argc.

Ответ 7

int count = 0; 
while(argv[++count] != NULL);

Теперь счетчик будет иметь длину argv