C Аргументы персонажа Array - PullRequest
1 голос
/ 07 февраля 2012

Я хотел бы передать аргументы и вывести их в виде массива символов или строки. Какой самый простой способ сделать это? Как только я получу их в виде массива символов, я хочу иметь возможность манипулировать массивом. Я смог передать их и использовать символьный указатель для перемещения по строке, но я хотел бы использовать массив символов. Есть ли простой способ сделать это? Я довольно новичок в C, вот что у меня есть.

    if(argc != 3){
            printf("incorrect number of arguments, program needs 3\n");
            exit(1);
    }

    char s1[20];
    s1 = (char*)argv[1];
    char s2[20];
    s2 = (char*)argv[2];

    printf("String1 is %s\n", s1);
    printf("String2 is %s\n", s2);

    exit(0);

Ответы [ 4 ]

1 голос
/ 07 февраля 2012

Строки, на которые указывает массив argv, можно изменять, вы можете просто изменить строки, на которые указывает массив argv, копировать их не нужно.

Из стандарта C:

(C99, 5.1.2.2.1p2) "Параметры argc и argv и строки, на которые указывает массив argv, должны изменяться программой и сохранять их последние сохраненные значения между запуском программыи завершение программы. "

1 голос
/ 07 февраля 2012

argv[1] и argv[2] уже уже указатели на массивы символов, так что вы можете использовать их напрямую. Более того (см. Сообщение @ ouah), строки уже изменяемы, поэтому вам может вообще не понадобиться ничего кроме этого.

Если вы действительно хотите иметь массив scope- local , вам необходимо использовать функцию C99, называемую «массивы переменной длины», поскольку длины строк известны только во время выполнения:

#include <string.h>

int main(int argc, char * argv[])
{
    char s1[strlen(argv[1]) + 1];
    strncpy(s1, argv[1], sizeof s1);

    // ...
}

В качестве альтернативы вы могли бы malloc иметь достаточно места для копии строки (скажем, char * s1 = malloc(strlen(argv[1]) + 1);), но тогда у вас не было бы локального массива в конце концов (и вы могли бы также использовать исходные строки, если вы на самом деле не хотел сделать копию).

1 голос
/ 07 февраля 2012

Вы можете просто напечатать значения argv напрямую:

printf("String1 is %s\n", argv[1]);
printf("String2 is %s\n", argv[2]);

Если вам нужно изменить строки, вот как вы это сделаете

char *newString1 = malloc(strlen(argv[1]) + 1 +  charactersToAdd); // add one for null termination.
strcpy(newString1, argv[1]);

// manipulate newString1 however you choose
printf("String1 is %s\n", newString1);
free(newString1);
0 голосов
/ 07 февраля 2012

argv уже char* (на самом деле это массив массива), однако они отмечены const как в «не изменять»;).На самом деле вы хотите сделать их копию, чтобы вы могли свободно ими манипулировать:

char str[40];
strcpy (str,argv[1]);

Теперь вы можете манипулировать str по своему желанию.

...