我正在尝试调试此代码,但似乎无法在命令行中找到导致此错误的错误:
./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;
}
答案 0 :(得分:1)
这里发生了很多事情。如果您只是尝试打印命令行参数,则已经在helper函数中找到了答案。只需直接在argc
/ argv
上使用该代码即可:
for (int i = 0; i < argc; i++) {
printf("%s\n", argv[i]);
}
由于您需要将所有内容复制到具有完全不同格式的数组中,所以我认为这个问题比您提供给我们的更多,因此我将解决这个问题/代码为
正如其他几个人所述,由于len = sizeof(argv[i])/sizeof(argv[0])
是指针,因此行argv[x]
将始终返回1。要测量参数编号x
的长度,您只需要sizeof(argv[x])
。
第char (*words)[ longest + 1 ]
个字符中的第(longest+1)
declares a pointer to an array行。然后,您分配一个更大的缓冲区((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)
,依此类推,以确保它们不会重叠。您还需要对助手功能进行类似的更改。