首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >格式字符串参数后的"+1“对printf()的影响

问格式字符串参数后的"+1“对printf()的影响
EN

Stack Overflow用户
提问于 2018-06-06 21:07:39
回答 2查看 395关注 0票数 5

我有一些与此代码相关的问题。printf的参数类型为const char*和... (变量参数列表)。

1)为什么程序的输出是d而不是127

2)是否将+1转换为字符串并传递给const char*类型的参数变量?

代码语言:javascript
复制
#include<stdio.h>
int main()
{
   printf("%d"+1 , 127); //how this will get executed?
   return 0;
}

输出:

代码语言:javascript
复制
d
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-06 21:11:42

第一个参数是指向char的指针。

文字"%d"将是指向'%'的指针,该指针后面是'd'和'\0'。它是指向char的指针,因为它是字符串文本的C表示:字符序列,末尾有一个'\0';作为参数表示,等等,作为指向char的指针。

但是,根据指针算法,"%d"+1是指向'd'的指针,其次是'\0'。

两者都是以零结尾的,适合于printf的参数。

因此,输出与

代码语言:javascript
复制
printf("d", ignored);

127变成“忽略”,即它被忽略了,因为"d"告诉printf不要期望任何东西,因为它没有任何特殊的字符序列,例如"%someletter“。因此,它不会期待,不会寻找任何东西,也不会做任何印刷,除了它认为已经给出的完全正常的字符串。

但是,请注意,其他参数(那些没有包含在格式字符串中的参数)确实得到了计算,然后忽略了。这是相关的,因为评估的任何副作用(例如函数调用)实际上都会发生。

详见此处:

http://en.cppreference.com/w/c/io/fprintf

票数 18
EN

Stack Overflow用户

发布于 2018-06-06 23:00:36

让我尝试帮助并添加到@Yunnosch的回答中,您可以这样做:

代码语言:javascript
复制
 char *str = "%d";
 printf (str, 127);

产出应是:

代码语言:javascript
复制
127

在上面的示例中,str像这样存储在内存中(这只是一个例子,现实生活中的地址类似于0xabc def12345678):

代码语言:javascript
复制
address | memory
--------+--------------
0       | %
1       | d
3       | \0

因此,str指向包含%的address 0 (或您系统上的等效地址),printf()获取该地址并从那里开始读取,读取直到到达空字符'\0‘。现在,每当它看到%时,它就查找下一个字符d、c、x等等,它从参数列表中读取下一个参数。如果您提供了d,它将输出十进制,如果您提供c,它将打印字符,x用于十六进制,还有更多。因此,printf()将读取所有字符并使用适当的参数替换%<place holder>,直到它到达空字符\0为止,但它将从提供的地址开始。

你的案子:

代码语言:javascript
复制
printf("%d"+1, 127);

与以下相同:

代码语言:javascript
复制
char *str = "%d";
printf (str + 1, 127); // printf receives address of character `d` as starting point

或者它类似于

代码语言:javascript
复制
char *str = "%d";
char *str1 = str+1; // increment the address of string by one
printf (str1, 127)

在这两种情况下,它都接收d的地址并从那里读取,直到到达\0为止。

如果你这样做的话:

代码语言:javascript
复制
printf ("%d" + 2, 127);

这与以下情况相同:

代码语言:javascript
复制
char *str = "%d";
printf (str + 2, 127);

它不会输出任何内容,因为,printf()将获得\0的地址。正如@Yunnosh所说,127将被忽视。

因此,+1和+2不会转换成字符串,它们会被添加到字符串的地址中。

我希望这能帮上忙,我想我已经回答了你们的两个问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50729625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档