我试图调试此代码,我似乎无法找到在命令行上给我这个错误:
./thisa
thisa
isa
a
test
相反,它需要给我这个:
./arguments
this
is
a
test
假设我输入“./arguments这是一个测试”作为我的输入。
关于bug可能在哪里的任何建议?
谢谢!
#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;
}
这里发生了很多事情。如果您只是尝试打印命令行参数,那么您已经在辅助函数的内容中得到了答案。只需在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 ]
字符的declares a pointer to an array (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(OK)。下一次循环时,它将参数#1复制到目标的字节1。这将覆盖你的第一个参数的一部分。你在这个缓冲区中有空间来写所有参数而不重叠,但是你的指针只是一个指针(你把它当成二维指针)。要像二维矩阵一样处理目标,您需要自己做一些指针算法:
strcpy(words[i * (longest + 1)], argv[i]);
这将写入第一个参数在字节0,第二个在字节(longest+1)
,第三个在字节2*(longest+1)
等,确保它们不会重叠。您还需要对辅助函数进行类似的更改。
• 如何在 C 语言的简单 shell 程序中打印从文件管道输入的输入,而不是重新打印在命令行输入的输入?
• 计算<< with char* argument prints string, not pointer value
• C 中以下代码的输出是什么。与使用 for 循环的数组打印相关[关闭]
• clang-format:如何在函数声明和函数定义中将每个输入参数放在一行中?
• 如何在使用 node 运行 javascript 脚本后返回命令行?
• error for-in 的主体应该包裹在 if 语句中,以从原型 guard-for-in 中过滤不需要的属性
• 如何在 Amazon AWS Lambda 函数中发布到 MQTT 主题?
• 意外的链接器错误:无法在导出类的构造函数中使用匿名命名空间中的函数?
• TypeError 我所有的打印函数:“TypeError: 'tuple' object is not callable”