getchar()和putchar()
这两个貌似像函数的东西,用于单个字符的读取和输入。说貌似,因为他们并不是函数,而是一个宏(#define )。所以用不到函数的参数传递,从而执行效率较高,而且写起来也简单些。
char a;
a=getchar();//相当于 scanf("%c",&a);
char b='m';
putchar(b);//相当于 printf("%c",b);
完整的例子:
#include"stdio.h"
#include"stdlib.h"//system()函数的头文件之一
//大写字母的阿斯克码比小写大32。 如a=97,A=65。
int main()
{
char a;
//输入 "#" 结束。实现小写字母转化为大写。
while((a=getchar())!='#'&&a>='a'&&a<='z')
{
putchar(a-32);
}
system("pause");
return 0;
} //这样的大小写转化函数,是我们自己写的。因为这些函数很常用。在“ctype.h”文件中写好了一组函数。当使用时,只要包含这些头文件就可以了。
getchar()缓冲区问题。
#include"stdio.h"
#include"stdlib.h"
int main()
{
char a;
char b;
char c;
//输入5个数,看看结果如何。 比如输入:abcde。
a=getchar();
b=getchar();
putchar(a);
putchar(b);
fflush(stdin);// 清空输入缓冲区的函数。比较一下屏蔽这行和不屏蔽这行的区别。前提是输入数量大于3.
c=getchar();
putchar(c);
system("pause");
return 0;
}
#include"ctype.h"
tolower() | 转化成小写字母 |
toupper() | 转化为大写字母 |
#include"stdio.h"
#include"stdlib.h"
#include"ctype.h"// 单字符转化和判断的函数头文件
int main()
{
char a='H';
printf("H被转化为了:");
putchar(tolower(a));
char b='b';
printf("\nb被转化为了:");
putchar(toupper(b));
system("pause");
return 0;
}
其实这些 ctype.h 内的函数我们都可以自己写出来。可以试试简单的凯撒加密解密。
写一个简单的凯撒密码函数试试。(a变成b,b变成c,以此类推的加密。解密原理相反。只是简单的,以后会培训到复杂的凯撒密码如何写)
isalnum() //返货true或者false 即0和1 | 判断是否为字母或数字 |
isalpha() | 判断是否为字母 |
isblank() | 判断是否为标准的空白符 |
iscntrl() | 判断控制符。如 ctrl+B |
isdigit() | 判断阿拉伯数字 |
isgraph() | 判断是否为除空格外可打印字符 |
islower() | 判断小写西姆 |
isprint() | 可打印字符 |
ispunct() | 判断标点 |
isspace | 判断空字符 |
isupper | 判断大写字母 |
isxdigit | 判断十六进制数字字符 |
统计字符,字母,数字,行数。
课后复习题答案。
字符串的输入输出
原理:
连续的输出单个字符,遇到 '\0' 则停止。
基本的字符串函数。
gets(),puts(),strlen(),sizeof(),其他函数下一小节讲。( strlen()头文件是 string.h ,其他3个头文件是 stdio.h )
#include"stdio.h"
#include"string.h"//strlen() 用到的头文件。可以自己试试写一个strlen()。
int main()
{
char a[40];
gets(a);//输入 a,回车结束输入
puts(a);//输出 a,
printf("sizeof(a); 的值为:%d \n",sizeof(a));//结果为总长40.
printf("strlen(a); 的值为:%d \n",strlen(a));//到 '\0' 的长度。
//每个汉字占连个 char 的位置。判断汉字相等需要两个位置都一样。
return 0;
}
现在我们来自己写一个计算字符串长度的函数。叫做 getchang();和一个判断汉字想等的函数,叫做isequ()。
#include"stdio.h"
#include"stdbool.h"
int getchang(const char m[])//求字符串长度。
{
int sum=0;
while(m[sum]!='\0')//并不知道 m 的长度, 所以用while()
{
sum++;
}
return sum;
}
bool isequ(const char m[],const char n[])//判断汉字字符串是否相等。
{
bool b=true;//一假则假,所以先赋值为 true。
if(m[0]!=n[0]||m[1]!=n[1])
{
b=false;
}
return b;
}
int main()
{
char a[]="国";
char b[]="国";
char c[]="中";
char *d="中" ;
printf("%d\n",isequ(a,d));
return 0;
}
函数的使用
函数是传递值,并没有改变原来的变量。
函数可以递归调用。递归可以使思路简化,但是浪费电脑资源。一般不要调用递归。
汉诺之塔问题:
#include"stdio.h"
#include"windows.h"
void move(char x, char y)
{
printf("%c-->%c\n", x, y);
}
void hanoi(int n,char one,char two,char three)
{
if (n ==1)
{
move(one,three);
}
else
{
hanoi(n-1,one,three,two);
move(one, three);
printf("**********") ;
hanoi(n - 1, two, one, three);
}
}
int main()
{
int n;
printf("输入需要移动几个盘子:\n");
scanf("%d", &n);
printf("**********************\n",n);
hanoi(n, 'A', 'B', 'C');
system("pause");
return 0;
}