Как распечатать основные аргументы функции в командной строке в C? - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь отладить этот код, и я не могу найти ошибку, которая дает мне это в командной строке:

./thisa
thisa
isa
a
test

Вместо этого он должен дать мне это:

./arguments
this
is
a
test

Предполагая, что я введу "./arguments, это тест" в качестве ввода.

Любые предложения о том, где может быть ошибка?

Спасибо!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printArguments( int rows, int cols, char args[][ cols ] )
{
   for (int i = 0; i < rows; i++) {
      printf("%s\n", args[i]);
   }
}

int main( int argc, char *argv[] )
{
   // Figure out the length of the longest command-line argument.
   int longest = 0;

   for (int i = 0; i < argc; i++) {
      int len = sizeof(argv[i])/sizeof(argv[0]);              
      if (len > longest) {
         longest = len;
      }
   }

   char (*words)[ longest + 1 ];
   int n = argc;
   words = (char (*)[longest + 1])malloc(n * (longest + 1) * sizeof(char));

   // Copy each command-line argument to a row of this new array.
   for (int i = 0; i < n; i++) {
      strcpy(words[i], argv[i]);
   }

   // Call a function that's expecting the command-line arguments as a 2D array
   printArguments( argc, longest + 1, words );

   return 0;
}

1 Ответ

0 голосов
/ 22 февраля 2019

Здесь много чего происходит.Если вы просто пытаетесь напечатать аргументы командной строки, ваш ответ уже есть в вашей вспомогательной функции.Просто используйте этот код непосредственно на 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) и т. д., гарантирующий, что они не будут перекрываться.Вам также необходимо внести аналогичные изменения в вашу вспомогательную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...