C语言基础:字符串和格式化输入/输出

来源:互联网 发布:pm4十字绣软件 编辑:程序博客网 时间:2024/05/21 07:04

1.strlen和sizeof应用于字符串得到的结果一样么?

虽然1字节存储一个字符,但是二者应用于字符串所得结果并不一样。

举个栗子:

#include<stdio.h>
#include<string.h>
#define PRAISE "You are an extraodinary being."
int main(void)
{
char name[40];

printf("What's your name? ");
scanf("%s",name);
printf("Hello, %s. %s",name, PRAISE);
printf("Your name of %d letters occupies %d memory cells.\n",strlen(name),sizeof name);
printf("The phrase of praise has %d letters",strlen(PRAISE));
printf("and occupies %d memory cells.\n",sizeof PRAISE);

return 0; 

输入以上程序,得出这样的结果


sizeof运算符报告,name数组有40个存储单元。但是,只有前8个单元用来存储porridge,所以strlen()得出的结果是11。name数组的第9个单元存储空字符,strlen()并未将其计入。


2.scanf()怎样读取?

假设scanf()根据一个%d转换说明读取一个整数。scanf()函数每次读取一个字符,跳过所有的空白字符,直至遇到1个非空白字符才开始读取。因为要读取整数,所以scanf()希望发现一个数字字符或者一个符号(+或-)。如果找到一个数字或符号,它便保存该数字并读取下一个字符。scanf()不断地读取和保存字符,直到遇到非数字字符。如果遇到了非数字字符,它便认为读到了整数的末尾。然后,scanf()把非数字字符放回输入。这意味程序在下次输入时,首先读到的是上一次读取丢弃的非数字字符。最后,scanf()计算已读取数字(可能还有符号)相应的数值,并将计算后的值放入指定的变量中。
如果使用字段宽度,scanf()会在字符结尾或者第一个空白字符处停止读取。
3.如果第一个非空白字符是A而不是数字,会发生什么情况?
scanf()将停在哪里,并把A放回输入中,不会把值赋给指定变量。程序在下次读取输入时,首先读到的字符是A。如果程序只是用%d转换说明,scanf()就一直无法越过A读下一个字符。
另外,如果使用多个带转换说明的scanf(),C规定在第一个出错处停止读取输入。


4.使用%s转换说明,scanf()的情况如何?
scanf()会读取除空格以外的所有字符。scanf()跳过空白开头读取第一个非空白字符。并保存非空白字符直到再次遇到空白。这意味着scanf()根据%s转换说明读取一个单词,即不包含空白字符的字符串。如果使用字符宽度,scanf()在字段末尾或第一个空白字符处停止读取。最后需要注意的一点是,当scanf()把字符串放进指定数组中时,它会在字符序列末尾加上'\0',让数组中的字符串成为一个C字符串。


5.printf()的*修饰符
如果你不想预先指定字符宽度,希望通过程序来指定,那么可以用*修饰符来代替字段宽度。但还是要用一个参数告诉函数,字段宽度应该是多少。
举个栗子:
#include<stdio.h>
int main(void)
{
unsigned width,precision;
int number=256;
double weight 242.5;

printf("Enter a field width:\n");
scanf("%d",width);
printf("The number  is : %*d \n",width,number);
printf("Now enter a width and a precision:\n");
scanf("%d %d",&width,&precision);
printf("Weight = %*.*f\n",width,precision,weight);
printf("Done!\n");


return 0;
}


6.scanf()的*用方法
把*放在%和转换字符中间,会使得scanf()跳过相应的输出项。

0 0