|
|
检测点12-5
1.对于源文件c1205.c,如果输入的是
223: 789~ 289.5678
程序工作正常并可打印预期的结果。为什么?请分析字符摘取的转换过程。
答:库函数首先执行格式串里的第一个指令“%d”。这是一个转换说明,执行这个指令时会忽略从输入流中摘取的空白字符,直至遇到非空白字符,然后收集连续的非空白字符,直至遇到空白字符,或者非数字字符。所以,scanf库函数会收集“2”“2”和“3”,在遇到“:”时停止收集并将“:”退回到输入流里。紧接着,将这三个数字字符转换为int类型的数值,保存到与之对应的变参所指向的对象里(实际上保存到对象i里了)。
接着执行第二个指令“:”。这是一个普通的多字节字符,要求从输入流中摘取的字符必须与之匹配。从输入流里摘取的是“:”,可以匹配。
再执行第三个指令“%ld”。首先摘取并忽略输入流中的空白字符,直至遇到非空白字符,然后收集连续的非空白字符,直至遇到空白字符,或者非数字字符。所以,scanf库函数会摘取并忽略三个空格,然后收集“7”“8”和“9”,在遇到空白字符时停止收集并将它退回到输入流里。紧接着,将这三个数字字符转换为long int类型的数值,保存到与之对应的变参所指向的对象里(实际上保存到对象l里了)。
继续执行第四个指令,它是三个空格。这将摘取连续的空白字符,直至遇到非空白字符(将它退回流中)或者遇到输入的结尾。在输入流的当前处并没有空白字符,所以作罢。
继续执行第五个指令“~”。这是一个普通的多字节字符,要求从输入流中摘取的字符必须与之匹配。从输入流里摘取的是“~”,可以匹配。
最后执行第六个指令“%5lf”。首先摘取并忽略输入流里的空白字符,直至遇到非空白字符,然后收集连续的非空白字符,直至遇到空白字符,或者非数字字符,或者已经收集了5个字符(因为指定了栏宽)。所以,scanf库函数会收集“2”“8”“9”“.”和“5”。紧接着,将这几个字符转换为double类型的数值,保存到与之对应的变参所指向的对象里(实际上保存到对象d里了)。
2.对于源文件c1205.c,如果输入的是
223 :789~ 289.5678
程序的工作不正常并且打印不符合预期的结果,为什么?请分析字符的摘取和转换过程。
答:库函数首先执行格式串里的第一个指令“%d”。这是一个转换说明,执行这个指令时会忽略从输入流中摘取的空白字符,直至遇到非空白字符,然后收集连续的非空白字符,直至遇到空白字符,或者非数字字符。所以,scanf库函数会收集“2”“2”和“3”,在遇到“:”时停止收集并将“:”退回到输入流里。紧接着,将这三个数字字符转换为int类型的数值,保存到与之对应的变参所指向的对象里(实际上保存到对象i里了)。
接着执行第二个指令“:”。这是一个普通的多字节字符,要求从输入流中摘取的字符必须与之匹配。从输入流里摘取的是空格,不匹配,中止摘取和转换过程,返回实际转换的指令数。
3.给定代码片段:
int d;
char c, s [256] = "";
scanf ("%d%c%s", & d, & c, s);
printf ("d=%d\n", d);
printf ("c=%c\n", c);
printf ("s=%s", s);
如果输入的是
25 hello
则打印输出什么?如果输入的是
25hello
则打印输出什么?
答:
输入 25 hello打印输出
25 hello
d=25
c=
s=hello
输入25hello则打印输出
d=25
c=h
s=ello
4.给定代码片段:
int r, d, n;
char c, s1 [256] = "", s2 [256] = "";
r = scanf("%%%5d%6s%c%*s%n %[056ab]", & d, s1, & c, & n, s2);
printf ("r=%d\n", r);
printf ("d=%d\n", d);
printf ("s1=%s\n", s1);
printf ("c=%c\n", c);
printf ("n=%d\n", n);
printf ("s2=%s\n", s2);
如果输入的是
%12345printf segment 5506b8ccd
则打印输出什么?如果输入的是
%25050689gsetment 5506b8ccd
则打印输出什么?
答:输入 %12345printf segment 5506b8ccd 打印输出
r=4
d=12345
s1=printf
c=
n=20
s2=5506b
输入 %25050689gsetment 5506b8ccd 则打印输出
r=4
d=25050
s1=689gse
c=t
n=17
s2=5506b
|
|