【问题标题】:C program Strings Example how come the result is 98?C程序Strings Example结果怎么是98?
【发布时间】:2015-06-10 17:19:12
【问题描述】:

C program Strings Example 结果怎么是98?

 #include <stdio.h>
int main() 
 {
  char s[]="%d%d%d";
   int a=9,b=8,c=5;
     printf(s+2,a,b,c);
    return 0;
     }

【问题讨论】:

  • 如果您执行s + 2,请考虑生成的字符串(顺便说一下,这与执行&amp;s[2] 相同)。然后想想如果你把它作为格式字符串放在printf中会发生什么。
  • 你认为printf("%d%d", 9, 8, 5) 的打印效果如何?

标签: c string dynamic-arrays c-strings


【解决方案1】:

string + x 是一个名为Pointer Arithmetic 的操作。 这样您就可以提供对数学计算的内存区域的引用,并且通过语义它相当于&amp;string[x] 计算背后实际发生了什么: (&amp;string + (x * sizeof(*string))) 这就是为什么它在应用于指针时是一个非常具体的概念。这代表数组以及它们毕竟衰减到指向第一个元素的指针。


至于您的代码,您有以下字符串:

char s[]="%d%d%d";

and 作为 printf 的格式字符串传递,后面两个字节,明确提供对 "%d%d" 的引用


因此:

printf(s+2,a,b,c);

后来被解析为:

printf("%d%d",a,b,c);

printf 除了要读取的两个整数之外,第三个将被简单地忽略。

【讨论】:

  • 这个答案更具技术性,对大多数用户更友好。而且更完整。
【解决方案2】:

在图像中说话的表达式s+2 将指针 s(在表达式中数组指示符转换为指向它们的第一个元素的指针)向右移动两个位置。所以 printf 语句中的格式字符串会是这样的

"%d%d"

因为表达式s+2指向字符串"%d%d%d"的第三个字符 作为结果声明

printf(s+2,a,b,c);

将仅输出两个第一个参数 a 和 b,因为指向的子字符串仅包含两个格式说明符,您将得到

98

例如,如果您在 printf 调用中使用表达式 s + 4,您只会得到

9

【讨论】:

  • @hacks 你什么意思?
  • @hacks 我通常很难为自己的想法找到正确的英文单词。:)
  • 那你并不孤单:)
  • @VladfromMoscow 感谢您的回复!我现在明白了。
猜你喜欢
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多