2012-07-30 119 views
7

任何人都可以向我解释我不明白的地方吗?传递char数组作为参数

我想将参数作为“字符串”传递(我知道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

取消引用数组,而传递给foo。所以如果它是一个c字符串文字,你只能传递第一个字节值 – Lefteris 2012-07-30 01:41:54

+0

你应该避免像'printf(s)'这样的表达式,因为它是一个不受控制的格式字符串。 – md5 2012-07-30 06:09:01

回答

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); 
} 
+0

我像你说的那样去除了星号,它仍然不起作用! 它说:重新定义:不同的基本类型 – Ryan 2012-07-30 01:45:50

+0

是的,这是一个全新的问题;错误地使用'printf'。 – chris 2012-07-30 01:48:30

+0

我做了两个修复,仍然说同样的事情,不会编译! – Ryan 2012-07-30 01:49:29

5

当你说foo (*array),你腐烂的阵列成指向第一个元素的指针,以便取消引用该元素,为您提供第一个字符。这就是你想要传递给函数的东西。不要留下星号,只要通过array就可以衰减成你需要的指针。

另一个问题是您没有正确使用printf。首先,这是一个reference。你需要传递一串令牌,告诉编译器接下来要做什么类型的参数,因为它没有办法告诉。在你的情况下,你的字符串将包含"%s"告诉它期望char *,然后你会通过array作为char *参数。

printf ("The string is %s", array); 
+0

我像你说的删除了asterix,它仍然不起作用!它说:重新定义:不同的基本类型 – Ryan 2012-07-30 01:46:38

+0

我注意到你重新调整到了以前的状态吗?在传递给函数的参数中是否会有一个星号?其实我只是注意到有或没有它,它不会工作 – Ryan 2012-07-30 01:51:56

+0

@Ryan,你不应该在任何地方解引用腐朽的数组。当它传递给一个函数时,它已经腐蚀成你需要的指针。 – chris 2012-07-30 01:52:38

1

argv是字符指针的数组,即意味着argv将要存储哪个你作为命令行参数传递的所有字符串的地址。

so argv[0]将给出您作为命令行参数传递的第一个字符串的地址,即存储在main函数中的指针变量array中的地址。

现在,您只需将地址传递给函数foo,但您传递的是该字符串的第一个字符。例如,如果您的第一个命令行参数是temp.txt,则您将字符t传递给函数foo。因此,在foo函数中,您正在使用字符指针变量array,因为将分配字符t的ASCII值。然后你将它传递给printf,它会将该ASCII值作为地址,并尝试访问该地址以进行打印,从而导致崩溃(意外行为)。

因此,您必须仅将命令行参数的地址传递给函数foo(如下所示)。

foo(array);

printf(array) - 这里printf将踏格式说明作为字符串(%s),它会尝试打印从地址array,直到它遇到一个空字符\0开始的所有字符。

不过还好添加printf像下面

printf("%s", array);

+0

优秀的解释!谢谢! – Ryan 2012-07-30 22:43:03