9

谁能向我解释一下我在这里不明白的地方?

我正在尝试将参数作为“字符串”传递(我知道 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);
}

多谢!

4

3 回答 3

18

你应该像这样调用函数:

foo(array);

您正在做的是取消引用指针,该指针返回 a 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);
}
于 2012-07-30T01:41:44.383 回答
5

当您说 时foo (*array),您将数组衰减为指向第一个元素的指针,以便取消对该元素的引用,从而为您提供第一个字符。这就是您要传递给函数的内容。去掉星号,array让它衰减到你需要的指针。

另一个问题是您没有printf正确使用。首先,这里有一个参考。您需要传递一个标记字符串,告诉编译器接下来期望什么类型的参数,因为它无法告诉。在您的情况下,您的字符串将包含"%s"告诉它期望 a char *,然后您将array作为该char *参数传递。

printf ("The string is %s", array);
于 2012-07-30T01:42:06.483 回答
1

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

soargv[0]将为您提供您作为命令行参数传递的第一个字符串的地址,您将其存储到函数中的指针变量arraymain

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

因此,您只需将命令行参数的地址传递给函数foo,如下所示。

foo(array);

printf(array)- 这里printf会将格式说明符当作 string( %s) 来处理,它会尝试打印从地址开始的所有字符,array直到遇到空字符\0

但最好在printf下面添加类似

printf("%s", array);

于 2012-07-30T12:22:55.073 回答