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