【问题标题】:How do I return a character array from a function? Then use the returned char in another function?如何从函数返回字符数组?然后在另一个函数中使用返回的字符?
【发布时间】:2015-02-03 08:58:04
【问题描述】:
    char * read_command()
{
        char command[25];

        char *input =  malloc(sizeof(char) * 25);
        printf("myRolodex Command: ");
        scanf("%c", &command);
        strcpy(input, command);
        return input;
}

void evaluate_command(char command[250])
{
        if (strcmp(command == 'I')==0)
        {
        printf("\nenterned i");
        }
}

int main()
{
evaluate_command(read_command))
return 0;
}

我试过这样做,但编译时得到:

rolodex.c: In function ‘read_command’:
rolodex.c:25: warning: format ‘%c’ expects type ‘char *’, but argument 2 has type ‘char (*)[25]’
rolodex.c: In function ‘evaluate_command’:
rolodex.c:32: warning: comparison between pointer and integer
rolodex.c:32: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast
/usr/include/string.h:143: note: expected ‘const char *’ but argument is of type ‘int’
rolodex.c:32: error: too few arguments to function ‘strcmp’
rolodex.c: In function ‘main’:
rolodex.c:43: warning: passing argument 1 of ‘evaluate_command’ from incompatible pointer type
rolodex.c:30: note: expected ‘char *’ but argument is of type ‘char * (*)()’
rolodex.c:43: error: expected ‘;’ before ‘)’ token
rolodex.c:43: error: expected statement before ‘)’ token

我应该让“read_command 可以打印一个提示,然后从用户那里读取一个字符。它可能希望在返回之前确保该命令是一个有效的命令。

evaluate_command 可以接受一个命令字符并决定它是哪个命令,然后执行相应的操作。”

【问题讨论】:

  • 我认为编译器错误很清楚。你有什么不明白的?
  • 我不太了解编译器错误。抱歉,对 c 很陌生。我的 read_command 是否复制用户输入的内容并将其放入输入中?
  • 否,在您修复编译器错误之前不会。您不能只是忽略它们并希望程序仍然正确。
  • 好的。请问,“格式‘%c’需要类型‘char ’,但参数2的类型是‘char ()[25]”,这是什么意思?在该行中,我需要使用其他东西而不是 %c 吗?我以为是 c 因为它是一个字符
  • 查看我的答案(并放松,因为这指出了进一步的问题)

标签: c pointers return character strcpy


【解决方案1】:

在您对evaluate_command() 的调用中,您传递了read_command,其计算结果为指向函数read_command 的指针。

这不对,你要调用函数并将其返回值传递给evaluate_command

因此,让它:

evaluate_command(read_command());
                             ^
                             |
                           make
                           call

也就是说,您的代码中还有其他问题,例如在 read_command 中,您尝试从未初始化的字符串中 strcpy(),这会给您带来未定义的行为。

你可以将read_command()改写为:

char * read_command(void)
{
  char cmd;

  if(scanf("%c", &cmd) == 1)
  {
    char *input = malloc(25);
    if(input != NULL)
    {
      input[0] = cmd;
      input[1] = '\0'; /* Make sure it's a valid terminated string. */
    }
    return input;
  }
  return NULL;
}

请注意,如果失败,它将返回 NULL

【讨论】:

  • 啊,我明白了,“未初始化的字符串”到底是什么意思?抱歉,我对 c 很陌生
  • 事实上,它并不是未初始化,而是未终止。您正在将一个字符读入command 的第一个元素,但不理会command 数组的其余部分。 Strcpy 复制到零字符为止,但数组的其余部分可能有也可能没有零。
  • 另外command 是一个指向数组的指针,所以你不需要scanf 中的&command - 这是一个指向字符指针的指针,这不是你想要的。错误信息都在告诉你真正的问题,请仔细阅读并按照他们所说的采取行动
  • @Paul 除了数组的一个元素之外,肯定所有元素都未初始化,从而使“字符串”作为一个整体未初始化?如果不能保证终止符的存在,则它不是字符串。
  • 每个 malloc() 都应该是 free()
【解决方案2】:

编译器错误的解释。不过,您的代码还有其他问题

 char * read_command()
{
        char command[25];

        char *input =  malloc(sizeof(char) * 25);
        printf("myRolodex Command: ");
       scanf("%c", &command);

rolodex.c:25:警告:格式“%c”需要类型“char ”,但参数 2 的类型为“char ()[25]”

所以这是说第二个参数是错误的类型。您想将字符放在command 的第一个元素中。为此,您需要传递一个指向该第一个字符的指针。您可以通过传递该字符的 hte 地址 -&command[0] 来做到这一点,尽管这与 command 相同。

        strcpy(input, command);
        return input;
}

void evaluate_command(char command[250])
{
    if (strcmp(command == 'I')==0)

rolodex.c:32: 警告:指针和整数的比较

这一行有两个比较。 ==0strcmp 的返回值进行比较,返回一个整数。所以不可能是那个。

对于另一个,我们将指向字符的指针 (command) 与字符文字(对于 C 来说只是一个整数)进行比较。所以这是错误的。

rolodex.c:32: 警告:传递“strcmp”的参数 1 使指针来自整数

比较的结果是(在 C 中)一个整数。但是您需要将字符串传递给strcmp

rolodex.c:32: 错误:函数‘strcmp’的参数太少

同样strcmp 有两个参数,那么这里发生了什么?你的意思大概是strcmp(command, "I")

        {
        printf("\nenterned i");
        }
}

int main()
{
    evaluate_command(read_command))

rolodex.c:43:警告:从不兼容的指针类型传递“evaluate_command”的参数 1 rolodex.c:30:注意:预期为“char *”,但参数类型为“char * (*)()” rolodex.c:43: 错误: 预期';' 在')' 标记之前 rolodex.c:43: 错误:')' 标记之前的预期语句

readcommand 是一个函数。你必须调用它(readcommand()

      return 0;
   }

【讨论】:

    猜你喜欢
    • 2011-09-04
    • 2014-02-06
    • 1970-01-01
    • 2016-12-17
    • 2015-01-23
    • 1970-01-01
    • 2013-04-14
    • 2014-04-11
    相关资源
    最近更新 更多