【问题标题】:pass char array as argument将 char 数组作为参数传递
【发布时间】:2012-07-30 01:39:51
【问题描述】:

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

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

非常感谢!

【问题讨论】:

  • 您在将数组传递给 foo.所以你只传递第一个字节值,如果它是一个 c 字符串文字
  • 你应该避免使用printf(s)这样的表达式,因为它是一个不受控制的格式字符串。

标签: c function pointers


【解决方案1】:

你应该这样调用函数:

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

【讨论】:

  • 我像你说的那样删除了asterix,它仍然不起作用!它说:重新定义:不同的基本类型
  • 我做了两个修复,仍然说同样的话,不会编译!
  • @Ryan:具体来说,您从编译器得到什么错误信息?
  • 'foo':重新定义;不同的基本类型
  • 即以函数的第一行作为错误的位置
【解决方案2】:

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

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

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

【讨论】:

  • 我像你说的那样删除了asterix,它仍然不起作用!它说:重新定义:不同的基本类型
  • 我注意到你重新编辑了它以前的样子?在传递给函数的参数中是否应该有一个星号?其实我只是注意到有没有它,它都行不通
  • @Ryan,您不应该在任何地方取消对衰减数组的引用。当它被传递给函数时,它已经衰减为您需要的指针。
【解决方案3】:

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

所以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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多