题目汇总:
- 输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
- 字符串逆序,即输入一个字符串,然后输出逆序后的字符串。例如:输入abcde,逆序后为edcba
第1题:
解法思路: ??getchar()函数的功能是读取你所输入的字符,直到回车为止。例如,你从键盘输入abcd这个字符串,然后按回车。按了回车之后,这四个字符会被存储到键盘缓冲区,这个时候你使用getchar()函数,它会从键盘缓冲区里一个一个去读取字符; ??getchar()的返回值一般情况下是字符,但也可能是负值,即返回EOF。这里要强调的一点就是,getchar函数通常返回终端所输入的字符,这些字符系统中对应的ASCII值都是非负的。因此,很多时候,我们会写这样的两行代码: ??char c; ??c = getchar(); 这样就可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar ()返回的是EOF,这个EOF在函数库里一般定义为-1。此时getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义方法如下 ??int c; ??c = getchar(); ??注意 ??!= 的优先级比 = 高,所以需要加上括号,即(ch = getchar())。(ch = getchar()) != '\n’这条指令会读取你输入的数据直到你按回车为止,也就是说,当输入的字符不是换行符的时候,继续往下执行;
代码如下:
#include<stdio.h>
int main(){
int letter = 0, number = 0, blank = 0, others = 0, ch;
while((ch = getchar()) != '\n'){
if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
letter++;
else if(ch >= '0' && ch <= '9')
number++;
else if(ch == ' ')
blank++;
else
others++;
}
printf("%d %d %d %d\n",letter,number,blank,others);
return 0;
}
第2题:
解法1: ??库函数gets()是在头文件stdio.h中,strlen()是在string.h里,用法如下: ??1、gets():与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。 ??2、strlen():使用格式strlen(s)。返回s的长度,不包括结束符NULL。 ??申明一个exchange()函数用来做逆序。len是数组a的长度。通过for循环,从后往前依次输出,因为数组下标是从0开始的,数组中最后一个元素的下标是len-1。输出字符用的是%c,字符串是%s > 解法2(使用指针): ??用数组存储所输入的字符,再反向输出;
解法1的代码如下:
#include<stdio.h>
#include<string.h>
int exchange(char a[]){
int i,len = 0;
len = strlen(a);
for(i=len-1; i>=0; i--){
printf("%c",a[i]);
}
return 0;
}
int main(){
char a[1000];
gets(a);
exchange(a);
return 0;
}
解法2的代码如下:
#include<stdio.h>
int main(){
char arr[1000];
char *p = arr;
scanf("%s",&arr);
while(*p!='\0'){
p++;
}
while(p!=(&arr[0])){
p--;
printf("%c",*p);
}
return 0;
}
|