【问题标题】:what happens if puts() function doesn't encounter null character?如果 puts() 函数没有遇到空字符会怎样?
【发布时间】:2015-08-21 06:37:03
【问题描述】:

考虑以下程序。

#include <stdio.h>
int main(void)
{
    char side_a[] = "Side A";
    char dont[] = {'W', 'O', 'W', '!' }; 
    char side_b[] = "Side B";
    puts(dont); /* dont is not a string */
    return 0;
}

我知道 puts() 函数在遇到空字符时会停止。但是在上面的程序中我没有指定空字符。那么什么时候停止打印呢?这个程序是否调用了未定义的行为?是否保证在各种 C 编译器上为该程序获得相同的输出? C 标准对此有何规定?

【问题讨论】:

  • 在 C 中,一个有效的字符串是空终止的,所有的 lib API 都期望空终止的字符串

标签: c null puts


【解决方案1】:

puts 最终会读到dont 的最后一个元素,这是未定义的行为。

所以不,你不能保证每次都有相同的输出。就此而言,您根本无法保证任何输出 - 您无法保证 anything 因为这是未定义的行为。

【讨论】:

    【解决方案2】:

    是的,此错误会导致您的程序没有定义的行为。正如该术语所表明的那样,您不能期望从执行此类程序中产生任何合理的结果。

    【讨论】:

      【解决方案3】:

      是的,它将是Undefined Behaviour,因此输出不会一直相同。 如果您想在这种情况下打印,我建议如下进行统一输出:

      printf("%.*s", 4, dont);
      

      【讨论】:

      • 好建议。人们很想使用sizeof(dont) 来优雅地处理其定义中的变化,但要小心地将其转换为(int) 以避免未定义的行为:printf("%.*s", (int)sizeof(dont), dont);。无论如何,这个解决方案并不完美,因为如果将dont 更改为char *,它会默默地行为不端。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2020-07-01
      相关资源
      最近更新 更多