为什么C语言的printf格式字符串中既有%c又有%s?

122 浏览
0 Comments

为什么C语言的printf格式字符串中既有%c又有%s?

为什么C的printf格式字符串中既有%c又有%s?\n我知道%c代表一个单字符,%s代表以空字符结尾的字符串,但是仅有字符串代表不就足够了吗?

0
0 Comments

C语言中的printf格式字符串既有%c也有%s的原因是%c用于打印单个字符,而%s用于打印字符串。然而,%c并不需要字符串以null字符结尾,因为可以通过在格式中提供精度的方式来解决这个问题(例如%.1s)。更重要的是,对于%s,无论是哪种形式,都需要提供一个指向一个或多个字符的指针。这意味着无法打印rvalues(计算表达式,函数返回值等)或寄存器变量。

从这些评论中可以看出,有人提出%c可以被%.1s替代的观点,但是这些回答都是错误的。对于%c,null字符结尾并不是一个问题。

另外,还某些情况下使用%.1s比%c更方便,因为不需要额外的格式描述符。然而,使用精度来打印单个字符仍然需要提供一个不同的参数类型,因此并没有真正的优势。

此外,还某些情况下%c的存在是为了处理rvalues。如果不考虑rvalues,语言/库的设计者可能会将其限制为%.1s,这样会使printf更加简洁和可读。

%c和%s同时存在的原因是为了分别打印单个字符和字符串。%c并不需要字符串以null字符结尾,而%s需要提供一个指向字符的指针。为了处理rvalues,%c是必需的。

0
0 Comments

C语言中的printf格式字符串中为什么既有%c又有%s?

%c用于打印一个字符,而%s则打印一个以null结尾的字符串。如果只有一个char类型的变量x,并且使用printf("%s", &x)来打印,这里需要提供变量x的地址,因为%s需要一个char*类型的参数。但是这样做可能会得到意想不到的结果,因为&x + 1可能不是0。所以除非字符是以null结尾的,否则无法直接打印单个字符(这样效率很低)。

另外,%s和%c在变长参数列表中所需的参数类型也不同,%s需要一个指针,而%c需要一个字符本身。更重要的是,只有当字符的地址可取时,才能打印该字符。这意味着无法打印函数的返回值,也无法打印寄存器变量。

为了避免null结尾的问题,可以提供一个精度参数。

0
0 Comments

C语言中的printf格式字符串同时拥有%c和%s是为了区分以空字符结尾的字符串和字符。如果只有%s,那么每个字符都必须以空字符结尾。

char c = 'a';

在上面的例子中,c必须以空字符结尾。这只是我的猜测 🙂

你可以在注释中做出假设,但不能在答案中。尽管如此,还是给个加1,因为你的假设是正确的.. 😉

这不是一个真正的答案,因为可以通过%.1s来避免这个问题。

那你的解决方法是让C只能使用%s吗?

可以这么说,只要你的char始终在可寻址的对象中,是的。

是的,这可能是Delphi format函数没有%c的原因。因为Pascal字符串没有以空字符结尾。

char在内存中是一个单字节,永远没有以空字符结尾。你的假设是错误的。

我没有这么说。也许是我的句子表达可能让人困惑。你可能知道,格式说明符%s的格式字符串必须以空字符结尾。如果语言中没有%c,那么在我上面的例子中,标识符c必须以空字符结尾才能与格式说明符%s一起使用。

我不知道是否可以依赖*printf实现不读取超过要显示的字节数。当然,如果"%.1s"是我们标准表达"%c"的方式,它们很快就会开始这样做。

混淆一个答案比给出一个错误的答案更糟糕...我不敢相信你会争论这个。

这是一个很差的答案...printf("%s", c)不能工作的原因不是因为空字符结尾,而是因为printf期望%s指向一个内存位置,而c是一个字符值。空字符结尾是printf("%s", &c)不能工作的原因,但即使它能工作,拥有%c标识符仍然是有意义的,因为要求使用&c与其他类型的变量打印方式不一致。所以只是说"是因为空字符结尾"是不正确的。

我不明白为什么有74个人认为这是正确的答案,因为它没有提到你必须传递一个char*才能使用%s打印一个字符。只是重申了BlueRaja说的话,但是c必须是一个char,而不是int,而%c适用于char和int(由于类型提升)。

单个字符没有以空字符结尾。字符串需要知道大小或特殊的'null'字符来告诉系统它的结束。

0