【问题标题】:Parameters for string pointing to array of strings?指向字符串数组的字符串参数?
【发布时间】:2014-07-01 18:51:49
【问题描述】:

我刚开始学习字符串,并且有一个关于使用指针参数将字符串数组发送到函数的问题。我试图简单地打印数组中的一个字符串,但我什至不能这样做。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int stringSum(char *s);
/*void minMaxValues(char *s, int *min, int *max);*/

int main(void)
{
    int value;
    char* text[] = { "1 + 2 + 3 + 4",
                     "7",
                     "30 + 20 + 10",
                     "9 + 900 + 90000 + 9000 + 90" };
    stringSum(&text);
}

int stringSum(char *s)
{
    printf("%s\n",s[0]);
}

我在尝试编译时遇到了一些名为分段错误的错误。我只是将字符串数组的地址传递给函数是不正确的吗?帮助将不胜感激

【问题讨论】:

  • 我将最终处理函数中的字符串,但现在我只是检查我是否已正确发送它
  • int stringSum(char *s[]);...stringSum(text);

标签: c function pointers parameters


【解决方案1】:

将您的函数标题更改为:

int stringSum(char **s);

这允许您传递整个数组。您当前所做的是将单个字符串传递给方法,然后仅打印第一个字符 (s[0])。

也不需要通过引用传递数组。只需stringSum(text); 就可以了。这是因为您想将数组地址的 value 传递给方法。当您索引它时(使用s[0]),您正在访问数组中第一个字符串的地址。


另外,请记住从 stringSummain 返回一个值,尽管这与您的错误无关。

【讨论】:

  • 这怎么可能允许传递char (*)[] 类型?
  • @hacks 如果您知道s 中的元素数量,则可以使用char* s[] 表示法,因此在函数定义中应为:char* s[4]。您也未能从 main 返回任何可能导致警告/错误的内容。见:ideone.com/pFZ2uB
  • @SimpleJ;我不是问这个问题的人:)
  • 我无法评论他的回答,因为我没有所需的声誉,但 Joachim 的解决方案并不等同于原始代码。 OP 想将整个数组传递给方法,Joachim 只传递了第一个字符串。
  • @hacks 需要详细说明吗?它编译并运行无错误/警告,完全符合 OP 的要求。
【解决方案2】:

两个问题:

  1. 您将字符串数组的地址作为参数传递给函数。这应该会给你一个很大的警告。

  2. 您告诉printf 打印一个字符串,然后传递一个字符作为参数。这也应该给你一个很大的警告。

以上两个都指向undefined behavior

要解决这些问题,首先你得用一个字符串来调用它,比如

stringSum(text[0]);

然后你必须打印字符串:

printf("%s\n", s);

经验教训:阅读警告并修复。警告通常是undefined behavior 的指标,在​​许多情况下会导致程序崩溃,例如分段错误。

【讨论】:

  • 有什么方法可以将整个字符串数组发送给函数,而不必多次调用函数?
  • @user3686360 当然有,但是你要修改参数为字符串数组。
  • 我投反对票的原因是我在回答的评论中给出的原因(我只是获得了足够的声誉来评论和投反对票,因此延迟了)。您通过重组 OP 的代码回答了这个问题,所以我并不认为这是在回答他的实际问题。这不是一个简单的重组 - OP 想要传递整个字符串数组,您将他的代码更改为传递单个字符串。
猜你喜欢
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多