大学时候学习了点C语言,本就学得浅显,现在也忘得差不多。只是记得几个循环,简单的输入输出,现在重新系统学习C语言,这么多年的失败学习经验告诉我,学习某个方面的东西,一定要系统且要注重细节,即掌握总分总的知识架构,而且要反复多次学习。
这次学习的内容有:数据类型,数组,指针,函数,文件,结构体和共用体等,后面关于C语言的知识会随时补充。
另需注意C语言编程格式:
一.数据类型
1.常量和变量
2.类型转换
二.数据输入输出
char c[10];
scanf("%s",c);//字符串中不能有空格,否则只读到第一个空格前的内容,但是字符串前面可以有空格。
#include <stdio.h>
#include <string.h>
int main(){
int n;
int i=0;
char c;
char s[10];
scanf("%d",&n);
s[n]='\0';
while(n>0){
fflush(stdin);
scanf("%c",&c);
s[i++]=c;
n--;
}
printf("%s",s);
return 0;
}
#include <stdio.h>
#include <string.h>
int main(){
int n;
int i=0;
char c;
char s[10];
scanf("%d",&n);
s[n]='\0';
while(n>0){
scanf("%c",&c);
if(c=='\n')
continue;
s[i++]=c;
n--;
}
printf("%s",s);
return 0;
}
以上两套代码都可正常换行输入。fflush(stdin)函数非常重要,在以后的多次换行输入程序中都要用上!
说明scanf()函数会读取上一次存留的换行符‘\n’ ,换行符会读入到缓冲队列。
for(i = 0; i < 10; i++)
{
scanf("%d", &num[i]);
}
scanf("%d %d %d %d %d %d %d %d %d %d",&c[0],&c[1],&c[2],&c[3],&c[4],&c[5],&c[6],&c[7],&c[8],&c[9]);
上面两个接受是等价的
使用getchar()函数:
#include <stdio.h>
#include <string.h>
int main(){
int n;
int i=0;
char c;
char s[10];
scanf("%d",&n);
s[n]='\0';
while(n>0){
c=getchar();
if(c=='\n')
continue;//退出本次判断,继续重新循环
s[i++]=c;
n--;
}
printf("%s",s);
return 0;
}
结果:
当程序调用getchar时.程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符。如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。打个比方,键盘缓冲区就像是一条水管连着你的程序,程序调用getchar()函数用户输入字符就相当于往水管里注水,这个水注多少取决于你输入多少,当你按回车停止注水时,getchar()函数才会开始从键盘缓冲区,也就是我们的水管里取水,那每次只会读一个字符也就是每次取一定量的水,当你在这之后继续调用getchar()函数时,会接着在水管里取上次没用完的水,因为你的水管没清空(缓冲区的刷新),那这个阶段就不用你再输入了,因为一调用getchar()函数就有水可取嘛,直到水管里没水了,你还调用getchar()函数,那这个时候你就得注水了也就是程序会等你按键。
scanf()函数和getchar()函数在吸收单字符时功能和过程都一样,都会吸收上一次残留在缓冲区中的换行符。