Как написать программу, которая принимает 2 строки в качестве аргументов из командной строки? - PullRequest
0 голосов
/ 26 октября 2019

Я хочу написать программу .c, используя только библиотеки stdlib.h, stdio.h и string.h. Программа принимает в качестве ввода из командной строки два слова при вызове программы на Си - например:

.mycode WORD1 WORD2

, где WORD1 и WORD2 оба представляют собой последовательность символов без пробелов, образующих одно слово.

Я хочу сохранить эти два слова в двух массивах символов в моем коде.

Я также должен вернуть сообщение пользователю, если при вызове кода было передано больше или меньше ТОЛЬКО 2 слов.

Вот что я пытаюсь:

int main(int argc, char *argv[])
{       
        //return error if user does not provide exactly two arguments
        if(argc!=3)
        {
                printf("Wrong number of arguments. Please input: ./codename WORD1 WORD2");
                exit(1);
        }

        char word1[]=argv[1];
        char word2[]=argv[2];

Я надеялся, что если я позвоню по коду: ./mycode привет, до свидания

, тогда word1 будет равно "привет"и word2 будет равно" до свидания ", но я получаю ошибку компиляции при попытке сделать это: char word1 [] = argv [1];

1 Ответ

1 голос
/ 27 октября 2019

argv - это массив указателей на строки. Строки, на которые они указывают, являются постоянными в течение всей программы. Таким образом, вы можете смело передавать указатели и использовать их. Но вам нужно использовать их как poiters:

int main(int argc, char *argv[])
{       
    //return error if user does not provide exactly two arguments
    if(argc!=3)
    {
            printf("Wrong number of arguments. Please input: ./codename WORD1 WORD2");
            exit(1);
    }

    char *word1 = argv[1]; // word is a pointer to char
    char *word2 = argv[2];
    printf ("%s, %s\n", word1, word2);
 }

Приведенный выше код не копировал строки, а скорее копировал указатели на строки. Сама строка занимает определенное место в памяти и остается там.

Во многих случаях вы можете действительно скопировать строку в новое место. Одна из проблем в вашем случае заключается в том, что вы не знаете, какой будет длина строки.

Вы можете использовать массивы динамического размещения или длины переменной, как в следующем примере:

int len1 = strlen(argv[1]);
int len2 = strlen(argv[2]);

char *word1 = malloc(sizeof (char) * (len1+1) ); // dynamic memory allocaion
char word2[len2+1];  // variable length array declaration.
strcpy(word1, argv[1]);
strcpy(word2, argv[2]);

Приведенный выше пример действительно копирует содержимое строк в другое место в памяти, используя функцию strcpy. Место в памяти должно быть на 1 символ больше, чем необходимо для строки, чтобы сохранить конечный «0»;

Существует несколько других способов обработки строк в «с».

...