Здесь много чего происходит.Если вы просто пытаетесь напечатать аргументы командной строки, ваш ответ уже есть в вашей вспомогательной функции.Просто используйте этот код непосредственно на argc
/ argv
:
for (int i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
Поскольку вы все время копируете все в массив с совершенно другим форматом, я предполагаю, что есть большек этому вопросу, чем к тому, что вы нам дали, поэтому я рассмотрю вопрос / код, как написано.
Как уже упоминали несколько других, строка len = sizeof(argv[i])/sizeof(argv[0])
всегда будет возвращать 1, поскольку argv[x]
- указатель,Чтобы измерить длину аргумента с номером x
, все, что вам нужно, это sizeof(argv[x])
.
Строка char (*words)[ longest + 1 ]
объявляет указатель на массив из (longest+1)
символов.Затем вы выделяете гораздо больший буфер ((longest+1) * argc
байт) и назначаете его указателю.Непонятно, что ты здесь пытаешься сделать.Вообще говоря, при выделении символьного буфера вы должны сделать что-то вроде этого:
char* my_ptr;
my_ptr = malloc(num_bytes);
Вам не нужно ничего кодировать относительно размера 1-D буфера в указателе, обычный символуказатель это все что вам нужно.Вам также не нужно вводить возвращаемое значение malloc()
.Он возвращает void*
, который неявно преобразуется в любой другой тип указателя без приведения.
Следующий фрагмент кода, вероятно, там, где вы сталкиваетесь со множеством проблем.
for (int i = 0; i < n; i++) {
strcpy(words[i], argv[i]);
}
Здесь words
- указатель на одномерный массив.Этот код начинается с копирования аргумента № 0 в байт 0 места назначения (ОК).В следующий раз в цикле он копирует аргумент № 1 в байт 1 места назначения.Это перезапишет часть вашего первого аргумента.У вас есть место в этом буфере для записи всех аргументов без наложения, но ваш указатель является только 1-D указателем (вы рассматриваете его как 2-D указатель).Чтобы рассматривать пункт назначения как двумерную матрицу, вам нужно выполнить некоторую арифметику указателя самостоятельно:
strcpy(words[i * (longest + 1)], argv[i]);
, которая будет записывать первый аргумент в байте 0, второй в байте (longest+1)
третий в байте 2*(longest+1)
и т. д., гарантирующий, что они не будут перекрываться.Вам также необходимо внести аналогичные изменения в вашу вспомогательную функцию.