有人可以向我解释一下我在这里不明白吗?
我试图将参数作为“字符串”传递(我知道c中没有字符串),以便稍后可以将该字符串与其他函数一起使用,例如它必须传递的文件名。 但我不知道它为什么不接受它或它应该是什么类型
#include <stdio.h>
int main ( int argc, char *argv[] )
{
char *array= argv[0];
foo(*array);
}
void foo( char *array)
// notice the return type - it's a pointer
{
printf(array);
}
非常感谢!
答案 0 :(得分:17)
你应该这样调用这个函数:
foo(array);
你正在做的是取消引用指针,它返回一个char
,这是字符串中的第一个字符。
您的printf
电话也应如下所示:
printf("%s", array);
您的整个固定代码应如下所示:
#include <stdio.h>
void foo(char *array)
{
printf("%s", array);
}
int main ( int argc, char *argv[] )
{
// TODO: make sure argv[1] exists
char *array= argv[1];
foo(array);
}
答案 1 :(得分:5)
当您说foo (*array)
时,您将数组衰减为指向第一个元素的指针,以便取消引用该元素,为您提供第一个字符。这就是你想要传递给函数的东西。省略星号,然后传递array
使其衰减成你需要的指针。
另一个问题是您没有正确使用printf
。首先,这是一个reference。您需要传递一串令牌,这些令牌告诉编译器接下来要接受哪种类型的参数,因为它无法说明。在您的情况下,您的字符串将包含"%s"
以告诉它期望char *
,然后您将array
作为char *
参数传递。
printf ("The string is %s", array);
答案 2 :(得分:1)
argv
是一个字符指针数组,这意味着argv
将存储您作为命令行参数传递的所有字符串的地址。
所以argv[0]
将为您提供作为命令行参数传递的第一个字符串的地址,您将其存储到array
函数中的指针变量main
中。
现在你必须只将地址传递给函数foo
,但是你要传递该字符串的第一个字符。例如,如果您的第一个命令行参数为temp.txt
,则您将字符t
传递给函数foo
。所以在foo
函数内部,你有一个char指针变量array
,因为将分配字符t
的ASCII值。然后你将它传递给printf
,它将该ASCII值作为地址,它将尝试访问该地址进行打印,这将导致崩溃(意外行为)。
所以你必须只将命令行参数的地址传递给函数foo
,如下所示。
foo(array);
printf(array)
- 此处printf
会将格式说明符作为字符串(%s
),它将尝试打印从地址array
开始的所有字符,直到它遇到空字符\0
。
但最好添加printf
,如下所示
printf("%s", array);