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»;
Существует несколько других способов обработки строк в «с».