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

时间:2016-08-12 12:10:48

标签: c string int printf

为什么这样做? (即如何将int传递给printf()会导致打印字符串)

#include<stdio.h>

int main() {
    int n="String";
    printf("%s",n);
    return 0;
}
  

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

输出:字符串

编译器:gcc 4.8.5

4 个答案:

答案 0 :(得分:8)

在您的代码中,

  int n="String";  //conversion of pointer to integer

是高度依赖于实施的 note 1

 printf("%s",n);   //passing incompatible type of argument

调用undefined behavior note 2  不要那样做

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

注1:

引用C11,章节§6.3.2.3

  

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

注2:

章节§7.21.6.1

  

[....]如果有任何论据   不是相应转换规范的正确类型,行为是   未定义。

以及%s格式说明符printf()

的参数类型
  

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

答案 1 :(得分:5)

您的程序的行为是 undefined

基本上,您要为const char*分配int,而printf会将其转换回来。但请注意这完全是巧合的:你不允许像那样抛出不相关的类型。

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

答案 2 :(得分:1)

int类型可以在今天的大多数计算机上存储4个字节的数字(从-2147483647到2147483647)

这意味着&#34;&#34;可以&#34;&#34;存储一些地址,唯一的问题是当你的地址大于2147483647时会导致溢出,你将无法获得地址,(这对你的程序来说非常糟糕)

地址是指存储空间的数字, 指针用来存储地址,它们更大(64位系统上8个字节,32位系统上4个字节),它们也是无符号的(只有正数)

这意味着,如果int n="String";的地址低于"String"低于2147483647,则会影响if (toState.name == 'index.login')return;,这不会导致问题,您的代码将会运行(不要这样做)

http://www.tutorialspoint.com/c_standard_library/limits_h.htm

现在如果你考虑一下,你可以猜到为什么32位系统有4GB的ram限制

(抱歉可能出现英语错误,我是法国人)

答案 3 :(得分:0)

使用SELECT fullVisitorId, sum(totals.visits) FROM `xxxxxxxx.ga_sessions_*` WHERE _TABLE_SUFFIX BETWEEN '20160808' and '20160810' GROUP BY fullVisitorId; (GCC)等选项进行编译会很快向您显示不应依赖此行为。