如何将用户在C中输入的字符传递给printf?

如何将用户在C中输入的字符传递给printf?,c,pointers,printf,C,Pointers,Printf,我刚从C开始,试图掌握指针的全部概念,我遇到了以下问题 我试图打印出一个由用户输入的字符,并将其传递给一个单独的函数: #define MAX_OPTION_INPUT 1 #define TRUE 1 #define FALSE 0 // print a menu void getCharacter() { char getNum[MAX_OPTION_INPUT+2]; int finished = FALSE; // get character from

我刚从C开始,试图掌握指针的全部概念,我遇到了以下问题

我试图打印出一个由用户输入的字符,并将其传递给一个单独的函数:

#define MAX_OPTION_INPUT 1
#define TRUE 1
#define FALSE 0


// print a menu
void getCharacter() {   
    char getNum[MAX_OPTION_INPUT+2];
    int finished = FALSE;

    // get character from user
    do {
        fgets(getNum, MAX_OPTION_INPUT+2, stdin);
        if (getNum[strlen(getNum) - 1] != '\n') {
            printf("Input one digit number please.\n");
            readRestOfLine();
      }
      else {
         getNum[strlen(getNum) - 1] = '\0';
         finished = TRUE;
      }
   } while (!finished);

    processChar(getNum);
}


// process menu
void processChar(char num) {
    printf("TADA: %c", num);
}
当我编译这段代码时,我得到了一个警告:传递参数'processChar'会从指针生成整数,而不需要强制转换

当我运行它时,它会打印出一些奇怪的字符,而不是我应该通过的字符

你能解释一下我在哪里漏掉了要点吗?
提前谢谢

将函数更改为接受字符*:

void processChar(const char *num)
{
    printf("TADA: %s", num); /* %s instead of %c */
}
你能解释一下我在哪里漏掉了要点吗


您正在传递和使用
num
,就好像它是一个字符,而实际上它是一个字符数组。

更改函数以接受
char*

void processChar(const char *num)
{
    printf("TADA: %s", num); /* %s instead of %c */
}
你能解释一下我在哪里漏掉了要点吗


你正在传递和使用
num
就好像它是一个字符,而实际上它是一个字符数组。

你从来没有在该代码中调用
processChar
。对不起,我的错,整个过程实际上是一个更大代码的一部分,我只是把它缩小到这两个函数*编辑您接受了一个告诉您更改函数签名的答案。你不需要;您只需要传递正确的类型。当您传入
getNum
时,数组降级为指向
char
的指针,因此您传入的是指向需要
char
的函数的指针。相反,只需传入
getNum[0]
(或任何合适的元素)。您从未在该代码中实际调用
processChar
。对不起,我的错,整个过程实际上是更大代码的一部分,我只是将其缩小到这两个函数*编辑您接受了一个告诉您更改函数签名的答案。你不需要;您只需要传递正确的类型。当您传入
getNum
时,数组降级为指向
char
的指针,因此您传入的是指向需要
char
的函数的指针。相反,只需传入
getNum[0]
(或任何适当的元素)即可。非常感谢!成功了。但是为什么你需要在里面放“const”呢?你不需要。不过,使用const告诉编译器您不打算更新某些内容是一种很好的方式。它不仅允许编译器在优化方面具有更大的灵活性,还意味着您保证不会更改传递给您的内容,并且编译器可以检查您是否这样做。@KonstantinLevin,如果另一个函数希望传入
常量字符*
常量字符[]
,因为您的函数没有更改它,该怎么办?事情就是这样发生的:。这是C++中经常出现的一些事情,因为有一个代码> >字符串< /代码>“类型”,您可以转换为<代码> const char */Cuth>,但是如果您试图调用一个函数,当它真的可以使用<代码> const char */Cuth>时,使用<代码> char */COD>要将字符串的结果转换为
常量字符*
转换为非常量,您必须做额外的工作。感谢您的解释!顺便问一下,在我将其更改为指针之前,它是否打印出一个奇怪的字符,因为它只是从堆栈中打印出地址,而不是实际值?@KonstantinLevin这是最有可能的解释。非常感谢!成功了。但是为什么你需要在里面放“const”呢?你不需要。不过,使用const告诉编译器您不打算更新某些内容是一种很好的方式。它不仅允许编译器在优化方面具有更大的灵活性,还意味着您保证不会更改传递给您的内容,并且编译器可以检查您是否这样做。@KonstantinLevin,如果另一个函数希望传入
常量字符*
常量字符[]
,因为您的函数没有更改它,该怎么办?事情就是这样发生的:。这是C++中经常出现的一些事情,因为有一个代码> >字符串< /代码>“类型”,您可以转换为<代码> const char */Cuth>,但是如果您试图调用一个函数,当它真的可以使用<代码> const char */Cuth>时,使用<代码> char */COD>要将字符串的结果转换为
常量字符*
转换为非常量,您必须做额外的工作。感谢您的解释!顺便问一下,在我将其更改为指针之前,它是否打印出了一个奇怪的字符,因为它只是从堆栈中打印出地址,而不是实际值?@KonstantinLevin这是最有可能的解释。