如何将字符串赋值给int并将该int传递给printf正确打印字符串?

ash*_*shu 5 c string int printf

为什么这样做?(即如何传递intprintf()打印字符串的结果)

#include<stdio.h>

int main() {
    int n="String";
    printf("%s",n);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

警告:初始化从指针生成整数而没有强制转换[默认情况下启用]
int n ="String";
警告:格式'%s'需要类型'char*'的参数,但参数2的类型为'int'[-Wformat =]
printf("%s",n);

输出:字符串

编译器:gcc 4.8.5

Sou*_*osh 8

在你的代码中,

  int n="String";  //conversion of pointer to integer
Run Code Online (Sandbox Code Playgroud)

是高度依赖于实施的注释1

 printf("%s",n);   //passing incompatible type of argument
Run Code Online (Sandbox Code Playgroud)

调用未定义的行为.注意2 不要这样做.

故事的道德:警告是有原因的,要注意他们.


注1:

引用C11,章节§6.3.2.3

任何指针类型都可以转换为整数类型.除非先前指定,否则结果是实现定义的.如果结果无法以整数类型表示,则行为未定义.[....]

笔记2:

第§7.21.6.1

[....]如果任何参数不是相应转换规范的正确类型,则行为未定义.

以及%s格式说明符的参数类型printf()

s如果不存在l长度修饰符,则参数应为指向字符类型数组的初始元素的指针.[...]


Bat*_*eba 5

程序的行为未定义.

从本质上讲,你分配const char*一个int,并且printf将其转换回.但是要把它视为完全巧合:你不能像那样抛出不相关的类型.

C让你有能力用脚射击自己.

  • 这让我想起了Bjarne Stroustrup引用的东西:_C让你很容易在脚下射击.C++让它变得更难,但是当你这样做时,它会让你的整个腿感到震惊._ :) (2认同)