如何从函数返回字符数组?然后在另一个函数中使用返回的char?

时间:2014-12-05 08:26:11

标签: c pointers return character strcpy

    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可以接受命令字符并确定它是哪个命令,然后执行相应的操作。“

2 个答案:

答案 0 :(得分:1)

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

 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的第一个元素中。要做到这一点,你需要传递一个指向第一个字符的指针。您可以通过传递该角色的地址 - &command[0]来完成此操作,尽管它与command完全相同。

        strcpy(input, command);
        return input;
}

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

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

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

对于另一个,我们将指向char(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;
   }

答案 1 :(得分:0)

在致电evaluate_command()时,您正在传递read_command,其评估为指向函数read_command的指针。

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

因此,请:

evaluate_command(read_command());
                             ^
                             |
                           make
                           call

也就是说,您的代码中存在其他问题,例如在read_command内部,您正在尝试从未初始化的字符串strcpy(),这将给您未定义的行为。< / p>

您可以将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