【问题标题】:c programming language exercise 1.10: what is wrong with my solution?c编程语言练习1.10:我的解决方案有什么问题?
【发布时间】:2016-08-14 12:11:50
【问题描述】:

我正在尝试使用 C 编程语言做练习 1-10。这个想法是创建一个输出等于输入的程序,但是,如果打印一个选项卡,它应该打印\t 而不是实际的选项卡。它还建议对退格/反斜杠做同样的事情,但我试图让它在前进之前只使用一个选项卡。

我确定一个选项卡的值是 9,所以我想出了这个代码。我对为什么这不起作用感到困惑-这似乎是解决问题的直接方法。如果字符 getchar 接收到的值等于 9,这是一个制表符,然后以纯文本输出 \t。我很想被打在头上,因为无论是什么导致我用以下代码吠叫错误的树。我看到一些人发布了解决方案here,但我仍然对导致此失败的小细节感到困惑。

   #include <stdio.h>

    main(){

    int c;
    while ((c = getchar()) != EOF) {
        if ((c == '\t') == 9) putchar("\t");
        else purchar(c);
    }
    }

这会带来以下编译错误

tenth.c: In function 'main':
tenth.c:7:35: warning: passing argument 1 of 'putchar' makes integer from pointe
r without a cast
     if ((c == '\t') == 9) putchar("\t");
                                   ^
In file included from tenth.c:1:0:
c:\mingw\include\stdio.h:645:43: note: expected 'int' but argument is of type 'c
har *'
 __CRT_INLINE __cdecl __MINGW_NOTHROW  int putchar(int __c)
                                           ^
C:\Users\*\AppData\Local\Temp\ccC4FPSb.o:tenth.c:(.text+0x18): undefined ref
erence to `purchar'
collect2.exe: error: ld returned 1 exit status

我也试过

main(){

int c;
while ((c = getchar()) != EOF) {
    if (c == '\t') putchar("\t");
    else purchar(c);
}
}

【问题讨论】:

  • 请注意,您应该至少按照旧 (C99) 标准进行编码,最好是新 (C11) 标准。两者都不允许main()(尽管 C89/C90 这样做,出于必要);两个较新的标准都要求显式指定返回类型 — 当您不打算使用命令行参数时,建议使用 int main(void)。如果您的编译器没有对此发出警告,请添加警告标志以使其发出警告 - 或获得更好的编译器。
  • 谢谢!我将更改我的代码以从正确的格式开始。
  • main() 函数有两个有效签名 两个签名的返回类型均为 int 在当前场景中建议使用:int main( void )
  • 这个表达式:((c == '\t') == 9) 表示如果 'c' 等于 at tab(这将设置一个真/假条件),那么它说这个真/假条件是否等于 9。建议:(c == '\t')
  • 发布的代码如果一致缩进会更容易阅读/理解。在每个左大括号“{”后缩进。在每个右大括号 '}' 之前取消缩进。

标签: c


【解决方案1】:

'" 在 C 中的区别:

  • "\t" 创建一个 char[2] 类型的 C 样式字符串,其中包含字符 \t(制表符)和 \0(NUL 终止字符)。
  • '\t'int 类型的单个字符。

putchar 接受int 参数并打印出单个字符。您应该使用(假设您的目标是向用户打印消息 \t 而不是制表符):

putchar('\\');  // Print the backslash (it must be escaped)
putchar('t');   // Print the t

注意\ 字符很特殊,需要用额外的\ 转义(所以'\\' 是一个int 类型的\ 字符)。

【讨论】:

    【解决方案2】:

    请注意,您在 else 语句中也错误地将“putchar”拼写为“purchar”。你可以看到编译器在抱怨它:

    C:\Users\*\AppData\Local\Temp\ccC4FPSb.o:tenth.c:(.text+0x18): undefined ref
    erence to `purchar'
    

    【讨论】:

      【解决方案3】:

      Putchar 只接受单个字符。你输入了“\t”,基本上是两个字符,因为双引号表示它是一个字符串,即使是 1 个字符的字符串也不能算作一个字符。所以试着做 putchar(' \t') 带单引号(表示单个字符)

      【讨论】:

      • 问题不在于它是两个字符,因为那样"" 就可以了。问题是 OP 试图将 char* 传递给采用 int 的函数。
      猜你喜欢
      • 1970-01-01
      • 2022-04-15
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多