Как найти длину 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
    }
}

Ошибка, которую я получаю, относится к строке 7. В ней говорится: «Передается аргумент 1« strlen »из несовместимого типа указателя». Я получаю ту же ошибку для функции strcat. В нем также говорится: «Дано char **, но ожидается const char *» для обеих функций.

Я пытаюсь заполнить новый массив всеми элементами argv, кроме первого. Я попробовал argv = &argv[1], и это не сработало.

Разве функции strlen() и strcat() не принимают массивы char?


person user1787351    schedule 06.09.2013    source источник
comment
Я думаю, вам нужен индекс в этом argv[], но не выходите за пределы [0..(argc-1], когда вы это делаете.   -  person WhozCraig    schedule 06.09.2013


Ответы (8)


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

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

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

person LihO    schedule 06.09.2013
comment
Я думаю, что понял. Я не могу использовать argv[], потому что на самом деле это не массив символов, а массив указателей на символы? если я сделаю копию argv[x] и использую ее в strcat как strcat(input, copyargv[x]), это сработает? - person user1787351; 06.09.2013
comment
argv[] — это массив строк (т. е. массив указателей на указатели на символы, где каждый указатель на символы указывает на начало строки); argc сообщает вам, сколько строк у вас есть; strlen возвращает длину переданной строки, поэтому ее можно вызывать только для char *, т. е. char [ ], т. е. строки): strlen(argv[i]), где i находится между 0 и argc. - person VeraKozya; 03.02.2018

Не уверен, почему никто не предложил изменить 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

person JackCColeman    schedule 06.09.2013

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

Теперь count будет иметь длину argv

person Kidambi Manoj    schedule 18.04.2014
comment
!= NULL не нужен. Вы можете просто сделать что-то вроде while(argv[++count]); - person Brian; 27.08.2018
comment
Разве это не дает вам только argc? Вы подсчитываете количество аргументов, а не общую длину строки, запущенной пользователем. - person urnonav; 27.01.2019

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

person user123    schedule 06.09.2013

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

person user1787351    schedule 07.09.2013

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

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

    return ret;
}

?

person I Have Fish    schedule 06.09.2013

argv принимает массив 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
}
person Ima Miri    schedule 06.09.2013

person    schedule
comment
Ваш ответ был бы действительно лучше, если бы вы могли добавить описание того, что делает ваше предложение. - person EcologyTom; 16.08.2018
comment
Извините. исходная задача заключалась в том, чтобы скопировать/добавить один массив в другой. для этого вам нужна длина массива. sizeof(argv)/sizeof(char) не будет работать. поэтому для меня самым простым способом получить длину было просто 1) преобразовать argv в строку 2) определить длину этой строки с помощью length(). @EcologyTom - person george; 16.08.2018
comment
Хороший материал, рассмотрите возможность редактирования вашего ответа, чтобы вся информация была в ответе, и будущим читателям не придется читать все комментарии, чтобы найти все детали. Добро пожаловать в СО! - person EcologyTom; 16.08.2018
comment
Вопрос помечен как C, а не C++. - person aschepler; 16.08.2018