繁体   English   中英

如何在C中的命令行上打印出主要功能参数?

[英]How to print out the main function arguments on the command line in C?

我正在尝试调试此代码,但似乎无法在命令行中找到导致此错误的错误:

./thisa
thisa
isa
a
test

相反,它需要给我这个:

./arguments
this
is
a
test

假设我输入“ ./arguments this is a test”作为输入。

关于错误可能存在的任何建议?

谢谢!

#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;
}

这里有很多事情。 如果您只是尝试打印命令行参数,则已经在helper函数中找到了答案。 只需直接在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);

您无需在指针中编码任何与一维缓冲区大小有关的内容,仅需要普通字符指针即可。 您也不需要强制转换malloc()的返回值。 它返回一个void* ,它将隐式转换为任何其他指针类型而无需强制转换。

下一段代码可能是您遇到很多问题的地方。

for (int i = 0; i < n; i++) {
    strcpy(words[i], argv[i]);
}

在这里, words是指向一维数组的指针。 该代码首先将参数#0复制到目标的字节0(OK)。 下次通过循环时,它将参数#1复制到目标的字节1。 这将覆盖您的第一个参数的一部分。 您在此缓冲区中有空间可以写入所有参数而不会重叠,但您的指针只是一维指针(您将其视为二维指针)。 要将目标像二维矩阵一样对待,您需要自己做一些指针运算:

strcpy(words[i * (longest + 1)], argv[i]);

这将第一个参数写入字节0,第二个参数写入字节(longest+1) ,第三个参数写入字节2*(longest+1) ,依此类推,以确保它们不会重叠。 您还需要对助手功能进行类似的更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM