【问题标题】:How to pass a character to printf that was input by user in C?如何将用户在 C 中输入的字符传递给 printf?
【发布时间】:2012-08-23 16:39:54
【问题描述】:

我刚从 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' 的参数 1 会在没有强制转换的情况下从指针生成整数

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

您能否向我解释一下我在哪里遗漏了这一点? 提前致谢!

【问题讨论】:

  • 你从未在该代码中真正调用过processChar
  • 对不起,我的错,整个事情实际上是一个更大的代码的一部分,我只是把它缩小到这两个函数。 *已编辑
  • 您接受了一个告诉您更改函数签名的答案。你不需要;您只需要传递正确的类型。当您传入getNum 时,数组降级为指向char 的指针,因此您传入的指针指向需要char 的函数。相反,只需传入getNum[0](或任何合适的元素。)

标签: c pointers printf


【解决方案1】:

更改函数以接受char *

void processChar(const char *num)
{
    printf("TADA: %s", num); /* %s instead of %c */
}

您能否向我解释一下我在哪里遗漏了这一点?

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

【讨论】:

  • 非常感谢!有效。但是为什么你需要把 'const' 放在那里呢?
  • 你不需要/。但是,使用 const 告诉编译器您不会更新某些内容是一种很好的风格。它不仅让编译器在优化方面有更大的灵活性,这意味着你保证不会改变传递给你的东西,编译器可以检查你是否这样做。
  • @KonstantinLevin,如果另一个函数想要传入 const char *const char[],因为你的函数没有改变它怎么办?这就是发生的事情:ideone.com/HRL36。这实际上在 C++ 中经常出现,因为有一个 string“类型”可以转换为 const char *,但是如果你尝试调用一个采用 char * 的函数,而实际上它本来可以采用 const char * ,你必须做额外的工作才能将字符串的结果转换为const char *转换为非常量。
  • 感谢您的解释!顺便说一句,在我将其更改为指针之前是否打印出一个奇怪的字符,因为它只是打印出堆栈中的地址而不是实际值?
  • @KonstantinLevin 这是最有可能的解释。
猜你喜欢
  • 1970-01-01
  • 2020-03-15
  • 2021-12-16
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多