求高手帮我看看这段代码!

linux群143201475 2011-01-11 12:44:04

#include <stdio.h>
int main()
{
int i;
unsigned int j;
char s[5];
fscanf(stdin,"%d %x %5[a-z] %*s %f",&i,&j,s,s);
printf("%d %d %s",i,j,s);
return 0;
}

输入数据 10 0x1b aaaaaaaa bbbbbbb
结果为: 10 27 aaaaa

求解释!
...全文
222 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lx3275852 2011-01-17
  • 打赏
  • 举报
回复
忘了弄代码标记了
一起学习!~

#include <stdio.h>
int main()
{
char *str1 = "abcdefghijklmnopq";
double d = 3.1415926535;
int i, j=1;
for( i = 5; i < 10; i++ )
{
printf( "%.*s\n", i, str1 );
}
printf( "********************\n");
for( i = 1; i < 10; i+=2)
{
printf( "%*.*lf\n", i, j++, d );
}
return 0;
}
lx3275852 2011-01-17
  • 打赏
  • 举报
回复
1.fscanf(stdin, ...); 相当于scanf( ... );
2.%d %x %5[a-z] 别人已经解释了!~
3. %*s %f 稍微解释一下, 这个* 也占一个参数位。。。。
所以本来fscanf(stdin,"%d %x %5[a-z] %*s %f",&i,&j,s,s); 后面应该有6个参数(不是想象中的5个),而只有3个参数成功读入,最后一个s 对应的是 * 不会读入 而 s 和 %f 没参数,也不会读入,如果有参数的话。 会分别读aaa 和 bbbbbbbb
而 scanf 中 一部分编译器 * 无论传什么参数 都以0代替,也就是说 无论写什么 %*s都相当于%0s

至于*怎么用,我写了一个小程序,参考一下!~
#include <stdio.h>
int main()
{
char *str1 = "abcdefghijklmnopq";
double d = 3.1415926535;
int i, j=1;
for( i = 5; i < 10; i++ )
{
printf( "%.*s\n", i, str1 );
}
printf( "********************\n");
for( i = 1; i < 10; i+=2)
{
printf( "%*.*lf\n", i, j++, d );
}
return 0;
}
lx3275852 2011-01-17
  • 打赏
  • 举报
回复
1.fscanf(stdin, ...); 相当于scanf( ... );
2.%d %x %5[a-z] 别人已经解释了!~
3. %*s %f 稍微解释一下, 这个* 也占一个参数位。。。。
所以本来fscanf(stdin,"%d %x %5[a-z] %*s %f",&i,&j,s,s); 后面应该有6个参数(不是想象中的5个),而只有3个参数成功读入,最后一个s 对应的是 * 不会读入 而 s 和 %f 没参数,也不会读入,如果有参数的话。 会分别读aaa 和 bbbbbbbb
而 scanf 中 一部分编译器 * 无论传什么参数 都以0代替,也就是说 无论写什么 %*s都相当于%0s

至于*怎么用,我写了一个小程序,参考一下!~
#include <stdio.h>
int main()
{
char *str1 = "abcdefghijklmnopq";
double d = 3.1415926535;
int i, j=1;
for( i = 5; i < 10; i++ )
{
printf( "%.*s\n", i, str1 );
}
printf( "********************\n");
for( i = 1; i < 10; i+=2)
{
printf( "%*.*lf\n", i, j++, d );
}
return 0;
}
niuchengshi 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 ksw_php 的回复:]
C/C++ code

#include <stdio.h>
int main()
{
int i;
unsigned int j;
char s[5];
fscanf(stdin,"%d %x %5[a-z] %*s %f",&i,&j,s,s);
printf("%d %d %s",i,j,s);
return 0;
}


……
[/Quote]

%d 使得amp=10,%x使得i=27,%5[a-z]使得s ="aaaaa",接着 %*s 表示正常从输入中获得值,但不把这个值付给任何变量,这个一直到结束,所有的输入都无法赋值。所以最后一个s 无法获得输入值的。
jialejiahi 2011-01-14
  • 打赏
  • 举报
回复
这么快就沉了啊,顶起来!上面帖子的代码第一次fscanf的时候b为什么不能正确赋值啊?
迷糊 2011-01-11
  • 打赏
  • 举报
回复
i 接收一个int 10;
j 接收一个16进制的int 0x1b,即10进制的27;
s 接收5位小写字母 aaaaa;
最后输入一个float,并赋值给s?没看懂什么意思。正在奇怪编译器为什么没有报错。
wyfwx 2011-01-11
  • 打赏
  • 举报
回复
char s[5];
jialejiahi 2011-01-11
  • 打赏
  • 举报
回复
Ljia @ ~/cfiles/tests $ cat test.c
#include <stdio.h>
int main()
{
int i;
unsigned int j;
char s[5];
float f;
fscanf(stdin,"%d %x %5[a-z] %*s %f",&i,&j,s,&f);
printf("%d %d %s\n",i,j,s);
printf("%d\n", j);
fscanf(stdin, "%x", &j);
printf("%d\n", j);
return 0;
}

Ljia @ ~/cfiles/tests $ ./a.out
10 0x1b abcdefg 3.23
10 0 abcde
0
0x1b
27
Ljia @ ~/cfiles/tests $
第一次代码没粘贴上。
jialejiahi 2011-01-11
  • 打赏
  • 举报
回复

Ljia @ ~/cfiles/tests $ cat test.c
#include <stdio.h>
int main()
{
int i;
unsigned int j;
char s[5];
float f;
fscanf(stdin,"%d %x %5[a-z] %*s %f",&i,&j,s,&f);
printf("%d %d %s\n",i,j,s);
printf("%d\n", j);
fscanf(stdin, "%x", &j);
printf("%d\n", j);
return 0;
}

Ljia @ ~/cfiles/tests $ ./a.out
10 0x1b abcdefg 3.23
10 0 abcde
0
0x1b
27
Ljia @ ~/cfiles/tests $

由楼主的问题引发的新问题,为什么第一次fscanf的时候b的值是0呢??
百思不得其解。
linux群143201475 2011-01-11
  • 打赏
  • 举报
回复
楼主表示不懂%5[a-z],%*s 但是现在明白了
感谢 snowwhite1!
谢谢各位的帮助!


PS:这个程序没有报错 我用的编译器是CodeBlocks. %5[a-z]以前从来没有见过,是正则匹配吗?
gladstonejay 2011-01-11
  • 打赏
  • 举报
回复
楼主认为输入了4个 输出也应该是4个。。。

不过也真是学习了格式输出的几个例子
NowDoIT 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 snowwhite1 的回复:]
fscanf(stdin,"%d %x %5[a-z] %*s %f",&i,&j,s,s);
输入数据 10 0x1b aaaaaaaa bbbbbbb
结果为: 10 27 aaaaa

10输入给变量i,0x1b输入给j,以十进制方式输出为27,%5[a-z]表示接收5个小写字符,%*s表示跳过后面的字符串,以空格、回车、跳格结束,最后是以单精度浮点数格式输入字符……
[/Quote]

++

ps:解释什么?输出和期待是相同的啊,楼主期待的是?
flysnowhite 2011-01-11
  • 打赏
  • 举报
回复
fscanf(stdin,"%d %x %5[a-z] %*s %f",&i,&j,s,s);
输入数据 10 0x1b aaaaaaaa bbbbbbb
结果为: 10 27 aaaaa

10输入给变量i,0x1b输入给j,以十进制方式输出为27,%5[a-z]表示接收5个小写字符,%*s表示跳过后面的字符串,以空格、回车、跳格结束,最后是以单精度浮点数格式输入字符串s,格式不匹配,应该报错。
YodaYu 2011-01-11
  • 打赏
  • 举报
回复
后面的说的没把握,欢迎大家指正哈,楼主要是知道答案也帮忙说一声
YodaYu 2011-01-11
  • 打赏
  • 举报
回复
%5[a-z]在正则中的意思是匹配5个a-z之间的字符,后面的不太明白猜测是格式控制时,未匹配空格,输入返回。
赵4老师 2011-01-11
  • 打赏
  • 举报
回复
Format Specification Fields: scanf and wscanf Functions
A format specification has the following form:

%
  • [width] [{h | l | I64 | L}]type

    The format argument specifies the interpretation of the input and can contain one or more of the following:

    White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.


    Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.


    Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.
    The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.

    When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.

    An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.

    Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.

    The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.

    An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.
赵4老师 2011-01-11
  • 打赏
  • 举报
回复
以下内容摘自MSDN98
scanf Width Specification
width is a positive decimal integer controlling the maximum number of characters to be read from stdin. No more than width characters are converted and stored at the corresponding argument. Fewer than width characters may be read if a white-space character (space, tab, or newline) or a character that cannot be converted according to the given format occurs before width is reached.

The optional prefixes h, l, I64, and L indicate the “size” of the argument (long or short, single-byte character or wide character, depending upon the type character that they modify). These format-specification characters are used with type characters in scanf or wscanf functions to specify interpretation of arguments as shown in the Table R.7. The type prefixes h, l, I64, and L are Microsoft extensions and are not ANSI-compatible. The type characters and their meanings are described in Table R.8.

Table R.7 Size Prefixes for scanf and wscanf Format-Type Specifiers

To Specify Use Prefix With Type Specifier
double l e, E, f, g, or G
long int l d, i, o, x, or X
long unsigned int l u
short int h d, i, o, x, or X
short unsigned int h u
__int64 I64 d, i, o, u, x, or X
Single-byte character with scanf h c or C
Single-byte character with wscanf h c or C
Wide character with scanf l c or C
Wide character with wscanf l c, or C
Single-byte – character string with scanf h s or S
Single-byte – character string with wscanf h s or S
Wide-character string with scanf l s or S
Wide-character string with wscanf l s or S


Following are examples of the use of h and l with scanffunctions and wscanf functions:

scanf( "%ls", &x ); // Read a wide-character string
wscanf( "%lC", &x ); // Read a single-byte character

To read strings not delimited by space characters, a set of characters in brackets ([ ]) can be substituted for the s (string) type character. The corresponding input field is read up to the first character that does not appear in the bracketed character set. If the first character in the set is a caret (^), the effect is reversed: The input field is read up to the first character that does appear in the rest of the character set.

Note that %[a-z] and %[z-a] are interpreted as equivalent to %[abcde...z]. This is a common scanf function extension, but note that the ANSI standard does not require it.

To store a string without storing a terminating null character ('\0'), use the specification %nc where n is a decimal integer. In this case, the c type character indicates that the argument is a pointer to a character array. The next n characters are read from the input stream into the specified location, and no null character ('\0') is appended. If n is not specified, its default value is 1.

The scanf function scans each input field, character by character. It may stop reading a particular input field before it reaches a space character for a variety of reasons:

The specified width has been reached.


The next character cannot be converted as specified.


The next character conflicts with a character in the control string that it is supposed to match.


The next character fails to appear in a given character set.
For whatever reason, when the scanf function stops reading an input field, the next input field is considered to begin at the first unread character. The conflicting character, if there is one, is considered unread and is the first character of the next input field or the first character in subsequent read operations on stdin.
applecyl038 2011-01-11
  • 打赏
  • 举报
回复
%*s表示读入字符串但不保存(后面所有字符被舍去)
乐CC 2011-01-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wyfwx 的回复:]
char s[5];
[/Quote]
后面的怎么接收的?定义成字符?

69,373

社区成员

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

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