【问题标题】:Multi-character character constant [-Wmultichar] Error in C多字符字符常量 [-Wmultichar] C 中的错误
【发布时间】:2014-07-08 13:57:16
【问题描述】:
#include <stdio.h>
main ()
{
    int c;
    while ((c = getchar()) != EOF ) {
        if (c == '\t') {
            while ((c = getchar()) == '\t');
                putchar ('\\t');
        }
        else (c == '\b') {
            while ((c = getchar()) == '\b');
                putchar ("\\b");
        }
        else (c == '\\' ) {
            while ((c = getchar()) == '\\');
                putchar ("\\");
        }
        putchar(c);
    }
}

尝试编译时出现以下错误:

cpytbb.c:在函数'main'中:
cpytbb.c:8:14:警告:多字符字符常量 [-Wmultichar]
cpytbb.c:10:20: 错误:预期‘;’在‘{’标记之前

请注意,第二个错误可能与问题无关。我是新手,很可能在我的代码中犯了一些错误。

如果需要,我正在使用 gcc。

编辑:我正在尝试将 \t \b 和 \ 作为简单文本“打印”出来。例如,如果我点击“退格”,它将打印 \b

【问题讨论】:

  • '\\t' 替换为'\t',将'\\b' 替换为'\b'。还要确保你给putchar() 一个char 参数而不是整个字符串...
  • 另外,putchar() 采用 int,而不是 char*:putchar ("\\b") '\b'(单引号,而不是双引号)。
  • 好的,谢谢两位。 goldilocks 这是否意味着放置双引号会将 int 更改为 char* (我什至不知道 char* 是什么,用谷歌搜索它)
  • putchar ('\\t'); 是打算打印一个反斜杠,后跟一个't',还是只是一个制表符?
  • 它的目的是将\t打印为字符串而不是制表符

标签: c gcc compiler-construction character


【解决方案1】:

几个问题:

  1. 使用 putchar() 尝试打印多个字符。反斜杠是一个字符,bt 也是。

  2. 在调用putchar() 时使用不同的引号。单引号用于单个字符(\b 之类的转义序列扩展为单个字符,所以可以,而 \\b 是反斜杠后跟 另一个 字符的转义序列),双引号用于字符串(即以零值字符 (\0) 结尾的一系列零个或多个字符。

  3. 即使您修复了这些问题,您的程序也会出错,因为您的 while 循环后面有一个分号。这意味着您有一个空循环(它只是在每次循环中执行一个“空语句”),然后在该循​​环之后它只调用一次putchar

  4. 两个 else 块,有条件。 else 不能有条件。您可能希望改为写else if( ... )

【讨论】:

    【解决方案2】:

    您的代码存在几个问题。

    首先,您应该使用puts,而不是putchar - putchar 用于打印单个字符,而看起来您想要打印多个字符。

    其次,问题在于putchar ('\\t') 行。这些应该是双引号,而不是单引号。其他putchar 语句是正确的(就引用而言)。

    第三,假设您希望您的代码打印出转义序列(即制表符导致反斜杠和 t 被打印),putchar ("\\") 中的字符串应该是"\\\\"。根据经验,要打印 N 反斜杠,您需要在字符串中使用 2N 反斜杠。

    但是,如果您想实际打印原始字符(即制表符输入会导致打印制表符),则需要保留 putchar 调用,但去掉双反斜杠并将双引号替换为单引号。

    最后,您的缩进表明putchar 调用应该在while 循环内,但是每个while 语句的末尾都有一个分号。这意味着putchar 调用不是while 循环的一部分。如果不是这样,请删除这些分号。

    也许编辑您的帖子以澄清您究竟想要完成什么会是有益的。

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 2015-09-12
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      相关资源
      最近更新 更多