前言
作为一个彩笔新手,被getchar()恶心了一个下午,终于在群友提醒下,有了想法。其实用gets()或者scanf("%s")都会更容易一些,但我还是想试试用getchar()。
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int i=1,j=0,n;
char a[21][21],ch;
scanf("%d",&n);
getchar();//吃一个回车
for(i=1;i<=n;i++)
{
while((ch=getchar())!='\n')
{
//用ch避免数组吃回车
a[i][j]=ch;
j++;
}
a[i][j]='\0';//数组末尾补0
j=0;
}
for(i=1;i<=n;i++){
puts(a[i]);//从a[1][0]开始打印第1行,遇到\0结束
}
return 0;
}
用上面思路可以搞定下面这题
2048:【例5.18】串排序
【题目描述】
对给定的n(1≤n≤20)个国家名(国家名字长度不超过20),按其字母的顺序输出。
【输入】
第一行为国家的个数n以下n行为国家的名字。
【输出】
n行,排序后的国名。
#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
int i=1,j=0,k=1,n;
char a[21][21],ch,t[21];
scanf("%d",&n);
getchar();
for(i=1;i<=n;i++)
{
while((ch=getchar())!='\n')
{
//用ch避免数组吃回车
a[i][j]=ch;
j++;
}
a[i][j]='\0';//数组末尾补0
j=0;
}
//冒泡排序比较
for(i=1;i<n;i++)
{
for(j=1;j<n+1-i;j++)
{
if(strcmp(a[j],a[j+1])>0)
{
strcpy(t,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],t);
}
}
}
//输出结果
for(i=1;i<=n;i++){
puts(a[i]);
}
return 0;
}
在结构体读取时的使用
要求输入姓名,成绩(空格分隔)并读取到student类,连续输入两个空格则停止读入,输出结果。
#include<stdio.h>
#include<stdlib.h>
struct student {
char name[20];
int score;
int rank;
};
int main(){
int i=0,j;
struct student a[10];
char ch;
int hnum=0;
while(i<10){
int w=0;//每行第几字符
while((ch=getchar())!=' '){
if(ch=='\n'){
hnum+=1;
}else{
hnum=0;//不是连续的两个\n就清零
}
if(hnum==2){
break;
}else if(hnum==1){
continue;//防止数组存入\n
}
a[i].name[w]=ch;
w++;
}
a[i].name[w]='\0';//数组末尾补0
if(hnum==2){
break;
}
scanf("%d",&a[i].score);
a[i].rank=0;//冒泡排序或者qsort这里就不写了
i++;
}
for(j=0;j<i;j++){
printf("%s %d\n",a[j].name,a[j].score);
}
return 0;
}