数组和字符串(分数统计_stat,单词的长度,乘积的末3位,计算器,旋转_rotate,进制转换1_base1,进制转换2_base2,手机键盘)
2017-07-30 20:50
537 查看
关于C语言字符串
别人家的整理scanf和gets的区别
字符串输入的方法
scanf(“%s”,in_buff);gets(in_buff);
fgets(in_buff,BUFFER_SIZE + 1,stdin);
1.当使用scanf函数时,如果在数组范围内有空格,那么第一个空格之后的字符将被忽略,这通常不是我们想要的。另外,scanf函数也不提供对写入数组的数据是否越界的检查。
2.当使用gets函数时,由于gets不提供对写入数组的数据进行是否越界的检查,所以也不安全。
3.而使用fgets函数时,只要第二个参数正好等于第一个参数传给它的数组的字节个数,那么fgets函数不会写出数组边界。所以,fgets函数是最好的选择.
1 分数统计_stat
好像这个办法很笨,不知道有没有好主意==
疑问:当分数为非负实数时(保留两位小数)。嗯,乘以100..==
int main() { int a[101]={0}; int i=0,u,max; while(scanf("%.2f",&u)!=EOF){ a[u]++; } for(i=0;i<100;i++){ if(a[i]>max) max=a[i]; } //输出分数出现次数最多的,如果有多个并列,从小到大输出。 for(i=0;i<100;i++) { if(a[i]==max) printf("%d\n",i); } return 0; }
输入:
12 34 56 78 89 12 12 12 34 34 34
输出:
12 34
2 单词的长度
输入一些单词,统计单词的平均长度
#include <stdio.h> #include<string.h> #include<ctype.h> int main() { char s[1000],buf[1000]; int sum=0,count=0,i; fgets(buf,sizeof(s),stdin); //从后往前,因为你不知道最后一个是什么时候截止 for(i=strlen(buf)-1;i>0;i--){ if(buf[i]==' ') count++; else sum++; } printf("%lf\n",(double)sum/count); return 0; } //i am best one
输入输出:
3 乘积的末3位——product(借鉴)
输入若干个整数,输出他们的成绩的末三位(取余),其中有干扰的字符串break是结束整个循环体,continue是结束单次循环
[b]一直没搞懂题目是要怎么输入的,认真看“输入若干个“,肯定不是要输入一个字符串,这样就可以使用while!=EOF来循环输出[/b]
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 100 #define MOD 1000 char a[MAXN]; int main() { int i, n; long d= 0, sum= 1; while(scanf("%s", a)!=EOF) { n = strlen(a); for(i = 0; i < n; i++) { if(a[i] >= 'A' && a[i] <= 'Z') break; //一定要判断是怎么退出的 continue; d=(d*10+a[i]-'0')%MOD; } if(a[i] >= 'A' && a[i] <= 'Z') continue; //如果是大写字母,就不用进行乘法 sum=sum*d%MOD; d= 0;//这种计数用的,每次都要清零 } printf("%3d\n",sum); system("PAUSE"); return 0; }
假设输入:
12 H 12 HU 12
输出:
728
4 计算器
编写程序,读入一行恰好包含一个加号、减号或乘号的表达式,输出它的值。这个运算符保证是二元运算符,且两个数均为不超过100的非负整数。运算数和运算符可以紧挨着,也可以用一个或多个空格、TAB隔开。行首末尾均可以有空格。提示:选择合适的输入方法可以将问题简化。[b]一直想着一步到位的,最后发现没有用。分成两部分反而更好处理,以运算符号为中心分成两个部分计算。[/b]
#include <stdio.h> #include<string.h> char buf[1010]; int main() { int m=0,n=0,i,l; int middle; while(fgets(buf,sizeof(buf),stdin)){ l=strlen(buf); for(i=0;i<l-1;i++){ if(buf[i]=='+'||buf[i]=='-'||buf[i]=='*') middle=i; } for(i=0;i<middle;i++){ if(buf[i]==' ') continue; m=m*10+buf[i]-'0'; } for(i=middle+1;i<l-1;i++){ if(buf[i]==' ') continue; n=n*10+buf[i]-'0'; } // if(buf[i]==' ') continue; // d=d*10+buf[i]-'0'; // if(buf[i]=='+') {sign=1;m=d;d=0;} // else if(buf[i]=='-'){sign=-1;m=d;d=0;} // else if(buf[i]=='*'){sign=0;m=d;d=0;} switch(buf[middle]) { case '+': printf("%d\n", m+n);break; case '-': printf("%d\n", m-n);break; case '*': printf("%d\n", m*n);break; } m = 0; n = 0; } return 0; }
输入:
1+1 2- 5 0 *1982
输出:
2 -3 0
5 旋转_rotate
#include <stdio.h> #include<stdlib.h> #include<string.h> char a[1010][1010],s[1001][1010]; int main() { int i,j,n; scanf("%d",&n); getchar(); char temp; /* for(i = 0; i < n; i++) scanf("%s", a[i]);*/ for(i=0;i<n;i++){ for(j=0;j<n;j++) scanf("%c",&a[i][j]); getchar(); } /* for(i=0;i<n;i++){ for(j=0;j<n;j++) printf("%c ",a[i][j]); printf("\n"); }*/ for(i=0;i<n;i++){ for(j=0;j<n;j++){ s[i][j]=a[j][n-i-1]; printf("%c",s[i][j]); } printf("\n"); } return 0; }
输入:
3 123 456 789
输出:
3 1 2 3 4 5 6 7 8 9
各种旋转
int main(){ int a[5][6]={1,3,4,2,5,2, 2,3,6,3,8,3, 2,9,7,9,4,8, 6,3,8,1,9,3, 9,3,5,2,8,5,}; int s90[6][5],ni90[6][5],x180[5][6]; int i,j; printf("顺时针旋转90度矩阵为:\n"); for(i=0;i<6;i++){ for(j=0;j<5;j++) { s90[i][j]=a[4-j][i]; printf("%2d%",s90[i][j]); } printf("\n"); } printf("逆时针旋转90度矩阵为:\n"); for(i=0;i<6;i++){ for(j=0;j<5;j++) { ni90[i][j]=a[j][5-i]; printf("%2d%",ni90[i][j]); } printf("\n"); } printf("旋转180度矩阵为:\n"); for(i=0;i<5;i++) { for(j=0;j<6;j++) { x180[i][j]=a[4-i][5-j]; printf("%2d%",x180[i][j]); } printf("\n"); } }
6 进制转换1_base1
#include <stdio.h> int a[100]; int main() { int i=0,b,n; scanf("%d%d",&b,&n); while(n>0){ a[i]=n%b; n=n/b; printf("%d",a[i++]); } return 0; }
输入:
2 15
输出:
1111
7 进制转换2_base2
#include <stdio.h> int main() { int n,b,k=1; int s=0; scanf("%d%d",&b,&n); while(n>0){ s+=n%10*k; k=k*b; n=n/10; } printf("%d",s); return 0; }
输入:
2 1111
输出:
15
8 手机键盘——keyboard
需要注意限制范围,当输入‘z’时候特殊处理,当输入‘a’到‘y’时取余,没有限制的话会出现又输出个1。原因可能是最后一个输入换行为一个字符’\0’,取余之后为0。#include <stdio.h> #include<string.h> int main() { c0c7 char a[100]; int i=0,k; while(scanf("%c",&a[i])!=EOF){ if(a[i]=='z'){printf("%c",a[i]);printf("4");} else if(a[i]>='a'&&a[i]<'z'){ k=(a[i]-'a')%3; switch(k){ case 0: {printf("%c",a[i]);printf("1");break;} case 1: {printf("%c",a[i]);printf("2");break;} case 2: {printf("%c",a[i]);printf("3");break;} } /* if(k==0){printf("%c",a[i]);printf("1");continue;} if(k==1){printf("%c",a[i]);printf("2");continue;} if(k==2){printf("%c",a[i]);printf("3");continue;}*/ } i++; } return 0; }
输入:
pig
输出:
p1i3g1
九宫格输入法示意图:
相关文章推荐
- C#编程中的Image/Bitmap与base64的转换及 Base-64 字符数组或字符串的长度无效问题 解决
- 通过手机键盘将字符串转换为数字的小程序
- Java byte 数组转换 16 进制字符串
- 面试题:将一个字符串数组中的字母按照以下规则排列:表中任何单词的首字母与其前面单词的尾字母相同! 要求:字符串只由小写字母构成,且每个字符串长度在2-100之间
- 统计一个字符串的最后单词的长度
- 数组-08. 字符串转换成十进制整数(15)
- 8、编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数, 然后打印出这个十进制整数对应的二进制形式。
- 数组-08. 字符串转换成十进制整数(15)
- 将十进制的转换为1~16(递归输出)或是1~32(字符串数组输出)进制
- 旋转字符串;编程珠玑第二章;rotate a one-dimensional vector;循环移位数组;编程之美
- 数组-08. 字符串转换成十进制整数(15)
- Base-64 字符数组或字符串的长度无效等问题解决方案
- 左旋转字符串LeftRotateString -- 翻转单词顺序
- 数组-08. 字符串转换成十进制整数(15)
- JAVA 接收键盘输入的字符串,转换成数组,输出ASCLL
- 编写函数 void count(char a[],char w[][10],int n,int b[]).功能是:统计w指向的数组中的n个单词在a指向的字符串中各自出现的次数(将非字符字符看作单词分割
- 前端处理手机键盘自带emoji表情输入评论后前端转换成字符串传入数据库处理
- Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)
- leetcode_318. Maximum Product of Word Lengths 求两个不相交的字符串的长度乘积的最大值,将字母转换成二进制形式,按位与比较是否有相同字母
- 算法:根据手机键盘结果将拼音字符串转换成号码串