【问题标题】:Newline Constants in CC 中的换行符常量
【发布时间】:2021-02-25 09:02:31
【问题描述】:

我的代码:

#include <stdio.h>

int main() {
   const int  LENGTH = 10;
   const int  WIDTH = 5;
   const char NEWLINE ='\n';
   int area;

   area = LENGTH * WIDTH;
   printf("value of area : %d", area);
   printf("%c", NEWLINE);

   return 0;
}

在上面的代码中输出:

value of area: 50

Process returned 0 (0x0)   execution time : 2.909 s
Press any key to continue.

插入了一个新行,但是当我更改 NEWLINE="\n" 尽管知道它是 char 类型时,编译器没有提示错误,也没有打印出换行符。为什么???

另外,我将代码修改为,

#include <stdio.h>

int main() {
   const int  LENGTH = 10;
   const int  WIDTH = 5;
   const char NEWLINE ='\n';
   const char k="hjk";
   int area;

   area = LENGTH * WIDTH;
   printf("value of area : %d", area);
   printf("%c", NEWLINE);
   printf("%c", k);
   return 0;
}

输出只是计算的面积和新行,但没有打印出k。我也觉得这很奇怪!可以给点建议吗?

由于我是 C 的初学者,请对我的建议提出足够的建议并指出我的错误。

【问题讨论】:

  • 您是否启用了编译器的所有警告?
  • '\n' 是一个字符,"\n" 是一个字符串常量......

标签: c char constants c-strings


【解决方案1】:

k 似乎是一个字符数组。 尝试使用:

const char k[] = "something";
printf("%s", k);

【讨论】:

    【解决方案2】:

    语句const char k="hjk"; 不是有效的C 代码。显然,您的编译器接受它并将字符串“hjk”开始的内存地址分配给k。内存地址和字符都实现为整数,因此内存地址被解释为字符的数字代码。

    因为 k 现在很可能是一个不可打印的字符,printf("%c", k); 不会打印任何内容。

    const char NEWLINE ='\n'; 会发生完全相同的情况。

    【讨论】:

    • 存在从指针到字符的转换,而不是从整数的转换。
    • 是的,但是将指针转换为字符没有意义。将指针转换为 char 的原因是指针本质上是一个整数,将整数转换为 char 是有意义的,因为每个 char 在内存中由一个整数表示。为了清楚起见,我在回答中提到了“整数”。
    • 否,const char k="hjk"; 语句会导致编译器诊断写入无效的 C 代码。
    • @Lundin,谢谢,我已经编辑了我的答案,我已经给你的答案 +1。
    【解决方案3】:

    当我更改 NEWLINE="\n" 尽管知道它是 char 类型时,编译器没有提示错误

    const char NEWLINE = "\n";无效C。这里详细解释无效的原因:"Pointer from integer/integer from pointer without a cast" issues

    编译器不需要产生“错误”,但需要产生某种诊断消息。见What must a C compiler do when it finds an error?

    为什么你的编译器决定抛出一个二进制文件而不考虑输入无效的 C 是任何人的猜测。您必须询问制作编译器的人。在 gcc 的情况下,您将找不到答案,因为这是完全没有记录的行为。

    因此,您从这样的“非 C”程序获得的任何输出也是完全不确定的,除非编译器记录了非标准编译器扩展之间的行为。 gcc 没有。

    同样,const char k="hjk"; 也是无效的 C。

    【讨论】:

    • 嗯,保存"\n"'\n' 是有区别的,因为它是在问题中完成的
    • @LorenzoZane 是的,我不会解释为什么'\n' 有效...
    【解决方案4】:

    问题是您试图将string 保存为char,因此您必须将const char k = "hjk" 更改为const char k[]="hjk" 并使用%s 而不是%c 打印它。

    #include<stdio.h>
    int main() {
      const int  LENGTH = 10;
      const int  WIDTH = 5;
      const char NEWLINE ='\n';
      const char k[]="hjk";
      int area;
    
      area = LENGTH * WIDTH;
      printf("value of area : %d", area);
      printf("%c", NEWLINE);
      printf("%s", k);
      return 0;
    }
    

    一些澄清:如果您保存“string”而不指定它是字符数组char[],如果您尝试将其打印为字符%c,则会生成警告(warning: incompatible pointer to integer conversion initializing 'const char' with an expression of type 'char [4]')如果您尝试将其打印为字符数组%s (string),您将收到segmentation fault

    【讨论】:

    • 代码不是有效的 C 并且没有确定性行为。无论如何,一些奇怪的编译器会吐出一些奇怪的二进制文件,但是任何人都会猜测它会做什么。 What must a C compiler do when it finds an error?
    • @Lundin 你能解释清楚一点吗?我不清楚你具体指的是什么(或者如果我想纠正我的答案会更好)
    • 我现在发布了一个答案。 stackoverflow.com/a/64820204/584518
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多