scanf("%*s %d", g, &h); 中的%*s如何理解

i945800687 2012-03-15 10:17:16

/*
我输入:catch 22
输出:22

分析:
scanf("%*s %d", g, &h);
程序跳过%*s,即“catch”,然后把22保存在
g数组第一个元素里面。

printf("%d\n", g[0]);
程序打印出g数组第一个元素的值,即g[0],22
*/

#include <stdio.h>

int main()
{
char g[10];
int h;

scanf("%*s %d", g, &h);
printf("%d\n", g[0]);

return 0;
}

请问我分析的对吗?
...全文
558 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
i945800687 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tpos 的回复:]
分析的一部分是对的。
其中%*s确实是使scanf跳过了catch,但%d指定scanf把22存储在g数组的前四个字节中了,而不是只存在了g[0]里,之所以printf打印g[0]得到了22,也是因为%d又指定printf从g[0]开始的地址读了4个字节,从而得到了22。
[/Quote]
这个好像更准确一点,书上讲转换说明符不对printf和scanf都有可能出现“打断”
i945800687 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhao4zhong1 的回复:]
scanf("%*s %d", g, &h);
应改为
scanf("%*s%d",&h);

跳过一个不含空白符的字符串。其中空白符可以是' ','\t','\n'之一。
[/Quote]
嗯,是跳过一个不含空白符的字符串
i945800687 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 justkk 的回复:]
C/C++ code
#include <stdio.h>

int main()
{
int h;
sscanf("abc 3", "%*s %d", &h);
printf("%d\n", h);
}



参考这个例子,%*s控制sscanf读入abc这个字符串并丢弃,不赋值给任何变量。
继续读入3,赋值给变量h
[/Quote]
嗯,我保存了以后再看看
lbq199204 2012-03-16
  • 打赏
  • 举报
回复
抑制字符*的作用是在按格式说明读入数据后不送给任何变量,即“虚读”,举例,scanf("%3d%*2d%3d"),输入12345678后,a=123 b=678,即中间的45,虚读。
goldbeef 2012-03-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 i945800687 的回复:]
C/C++ code

/*
我输入:catch 22
输出:22

分析:
scanf("%*s %d", g, &h);
程序跳过%*s,即“catch”,然后把22保存在
g数组第一个元素里面。

printf("%d\n", g[0]);
程序打印出g数组第一个元素的值,即g[0],22
*/

#include <stdio.……
[/Quote]就没有 "%*s"这么一说,
如果是 scanf("%*s",g);那么其实什么都没有读入,你可以令 int l= scanf("%*s",g);
你谁发现 l是0
ProgrammingRing 2012-03-16
  • 打赏
  • 举报
回复
scanf的*就是跳过它不输入
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tpos 的回复:]
分析的一部分是对的。
其中%*s确实是使scanf跳过了catch,但%d指定scanf把22存储在g数组的前四个字节中了,而不是只存在了g[0]里,之所以printf打印g[0]得到了22,也是因为%d又指定printf从g[0]开始的地址读了4个字节,从而得到了22。
[/Quote]我同意这个说法
nanjingnew4 2012-03-16
  • 打赏
  • 举报
回复
不读取%s这个数据
tpos 2012-03-16
  • 打赏
  • 举报
回复
分析的一部分是对的。
其中%*s确实是使scanf跳过了catch,但%d指定scanf把22存储在g数组的前四个字节中了,而不是只存在了g[0]里,之所以printf打印g[0]得到了22,也是因为%d又指定printf从g[0]开始的地址读了4个字节,从而得到了22。
赵4老师 2012-03-16
  • 打赏
  • 举报
回复
scanf("%*s %d", g, &h);
应改为
scanf("%*s%d",&h);

跳过一个不含空白符的字符串。其中空白符可以是' ','\t','\n'之一。
shyrgst 2012-03-16
  • 打赏
  • 举报
回复
我也记得%*s 应该是sscanf中使用的,好像没有看到过scanf这么使用的。
lele1028265767 2012-03-16
  • 打赏
  • 举报
回复
额,我看明白了,LZ应该也明白了吧
从头来过 2012-03-16
  • 打赏
  • 举报
回复
%*s控制sscanf读入字符串不进行处理
justkk 2012-03-16
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
int h;
sscanf("abc 3", "%*s %d", &h);
printf("%d\n", h);
}


参考这个例子,%*s控制sscanf读入abc这个字符串并丢弃,不赋值给任何变量。
继续读入3,赋值给变量h
i945800687 2012-03-16
  • 打赏
  • 举报
回复
谢谢各位解答,不过还是不太明白
kyle 2012-03-15
  • 打赏
  • 举报
回复
scanf()函数是格式化输入函数,转换字符有:     
c 读单字符   
d 读十进制整数   
i 读十进制、八进制、十六进制整数   
o 读八进制数   
s 读字符串   
x 读十六进制数   
X 读十六进制数  
 p 读指针值      
u 读无符号十进制整数
xiaohuh421 2012-03-15
  • 打赏
  • 举报
回复
这样应该不行吗, %*S,这个S要取多少呢?
一般要忽略串时应该用%*[]这样的格式,
秦无邪 2012-03-15
  • 打赏
  • 举报
回复
* 表示本输入项在读入后不赋值给相应的变量
请参考百度百科scanf:
http://baike.baidu.com/view/1390039.htm

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧