字符跟字符串
字符是以数值存储在电脑里(硬盘、内存);这个数值就是二进制数,也就是0101,编写成ASCII码表,将我们需要的字符(包括控制字符等)——对应一个数值,0-127
#include <stdio.h>
int main()
{
char ch01,ch02;
ch01='0'; //赋值是字符'0',对应的数值为48
ch02= 0; //赋值是数值0,对应数值就是0
return 0;
}
如果将字符放入数组中
#include <stdio.h>
int main()
{
int i;
int a[10]={'h','e','l','l','o'};
for(i=0;i<10;i++){
printf("a[%d]=%c ",i,a[i]);
printf("a[%d]=%d\n",i,a[i]);
}
return 0;
}
结果为:
数组后面的初始化为0,但ASCII码表里0指向空。
获取字符getchar()
getchar()——带回显,换行为结束标志
getch()——不带回显,不用等待用户按回车,只要用户按一个键,就立刻返回,返回是用户输入的ASCII码,出错返回-1
getche()——带回显,不用等待用户按回车,只要用户按一个键,就立刻返回,返回是用户输入的ASCII码,出错返回-1
**getch()和getche()的头文件在<conio.h>**
获取字符串gets和fgets
1.scanf(),格式转化符%s
无限获取缓冲区内容,直到遇到'\n'scanf才结束,但%s遇到“空格”、“tab键”、“换行”或文件结束符(EOF)认为需要获取结束。
指定拿取内容多少(%数字s)
2.gets()
从缓冲区不停的拿,也可能造成缓冲区溢出现象,遇到“换行”或文件结束符(EOF)才认为结束
使用gets()时,系统将最后“敲”的换行符从缓冲区取出来,然后丢弃
3.fgets()
fgets(字符数组名,n,文件指针)
其中的n是一个正整数,表示从文件中读出的字符串不超过n-1个字符。在读入的最后一个字符加上字符串结束标志'\0';stdin 键盘
打印字符串puts
1.循环打印字符
2.直接使用格式化字符%s,需要自己加入换行符,但可以发家其他补充信息
3.调用puts()函数打印
使用puts()输出更简洁、更方便,使用puts()显示字符串时,系统会自动在后面添加一个换行符,但不能添加其他补充信息
字符处理函数ctype.h
字符处理函数库<stype.h>包含里对字符进行测试和操作的函数。每个函数都接收一个字符作为实参。
单字节 |
宽字节 |
描述 |
isalnum |
iswalnum |
是否是字母数字 |
isalpha |
iswalpha |
是否为字母 |
islower |
iswlower |
是否为小写字母 |
isupper |
iswupper |
是否为大写字母 |
isdigit |
iswdigit |
是否为数字 |
isxdigit |
iswxdigit |
是否为16进制数字 |
iscntrl |
iswcntrl |
是否为控制字符 |
isgraph |
iswgraph |
是否为图形字符(例如:空格、控制字符都不是) |
isspace |
iswspace |
是否为空格字符(包括制表符、回车符、换行符等) |
isblank |
iswblank |
是否为空白字符(C99/C++11新增)(包括水平制表符) |
isprint |
iswprint |
是否为可打印字符 |
ispunct |
iswpunct |
是否为标点 |
tolower |
towlower |
转换为小写 |
toupper |
towupper |
转换为大写 |
/*字符处理函数 头文件 ctype.h*/
#include <stdio.h>
#include <ctype.h>
int main()
{
int ret=0;
ret=isalnum('1'); //数字返回4
ret=isalnum('a'); //小写字母返回2
ret=isalnum('A'); //大写字母返回1
ret=isalnum('+'); //其他返回0
//isalnum() 如果是字母或者数字返回非0,其他返回0
ret=isalpha('1'); // 数字返回0
ret=isalpha('a'); //小写字母返回2
ret=isalpha('A'); //大写字母返回1
ret=isalpha('+'); //其他返回0
//isalpha() 如果是字母(包括大小写),返回值为非0,其他返回0
ret=islower('1'); // 数字返回0
ret=islower('a'); //小写字母返回2
ret=islower('A'); //大写字母返回0
ret=islower('?'); //其他返回0
//islower 如果是小写字母返回非0,其他返回0
ret=isupper('1'); //数字返回0
ret=isupper('a'); //小写字母返回0
ret=isupper('A'); //大写字母返回1
ret=isupper(')'); //其他返回0
//isupper 如果是大写字母返回非0,其他返回0
ret=isdigit('1'); //数字返回1
ret=isdigit('a'); //写字母返回0
ret=isdigit('A'); //大写字母返回0
ret=isdigit(')'); //其他返回0
//isdigit 如果是数字返回非0,其他返回0
ret=isxdigit('1'); //数字返回128
ret=isxdigit('a'); //字母a~f返回128
ret=isxdigit('f');
ret=isxdigit('g'); //字母>g返回0
ret=isxdigit('A'); //字母A~F返回128
ret=isxdigit('F');
ret=isxdigit('G'); //字母>G返回0
ret=isxdigit('='); //其他返回0
//isxdigit 十六进制数 数字、大小写字母a~f返回数字,其他返回0
printf("ret=%d\n",ret);
return 0;
}
课后练习:
1.编写一个函数,需要一个指向字符串的指针变量作为参数,并返回字符串的长度。main函数调用进行测试。
#include <stdio.h>
/*编写一个函数,需要一个指向字符串的针变指量作为参数,并返回字符串的长度。main函数调用进行测试。*/
int main()
{
// char *arr;
int n;
char *ch;
char *d="sdadsdfdrfdsg";
ch=d; //指针初始化
// while(*ch!='\0') {
// printf("%c ",*ch);
// ch++;
// }
// printf("%#p ",ch);
n=num(ch);
printf("%d",n);
return 0;
}
int num(char *a)
{
int ret=0;
//printf("%#p ",c);
while((*a)!='\0'){
a++;
ret++;
}
return ret;
}
2.设计一个函数,其参数为一个字符串指针,并且返回一个指针,该指针指向 字符串中所指位置后(包括该位置)的第一个空格字符,如果找不到空格字符, 就返回空指针
#include <stdio.h>
/*设计一个函数,其参数为一个字符串指针,并且返回一个指针,该指针指向
字符串中所指位置后(包括该位置)的第一个空格字符,如果找不到空格字符,
就返回空指针*/
int main()
{
char arr[10];
printf("请输入字符串");
gets(arr);
int n;
n=chuli(arr,10) ;
if(n==NULL)
printf("无空格");
else
printf("第%d个为空格",n) ;
return 0;
}
int chuli(char *p,int n )
{
//int ret=0;
int i;
// printf("%c",*p);
for(i=0;i<n;i++){
// ret++;
if(*p==' '){
return i+1;
}
p++;
}
return NULL;
}
3.编写一个程序,要求连续输入n个不重复的字母,利用指针引用方式按照字母表进行排序
#include <stdio.h>
/*编写一个程序,要求连续输入n个不重复的字母,利用指针引用方式按照字母表进行排序。*/
void ssort(char *ab,int a);
int main()
{
char arr[5];
int i;
printf("请输入一串字符串,且不重复");
gets(arr);
// printf("%#p ",p);
ssort(arr,5);
for(i=0;i<5;i++)
{
printf("%c",arr[i]);
}
return 0;
}
void ssort(char *ab,int a)
{
int i,j;
// char *arr;
// arr=ab;
// printf("%#p ",arr);
//printf("%c",*arr);
char temp;
for(i=0;i<5;i++){
for(j=i+1;j<5;j++){
if(*(ab+i)>*(ab+j)){
temp=*(ab+i);
*(ab+i)=*(ab+j);
*(ab+j)=temp;
}
}
}
}
4.输入一个字符串,内有数字和非数字字符,例如: A123x456 17960? 302tab5876 将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123放在a[0],456放在a[1] ......,统计共有多少个整数,并输出这些数。
#include <stdio.h>
/*输入一个字符串,内有数字和非数字字符,例如:
A123x456 17960? 302tab5876其中连续的数字作为一个整数,
依次存放到一数组a中。例如,123放在a[0],456放在a[1] ......,
统计共有多少个整数,并输出这些数。
*/
int main()
{
char arr[7];
char *p;
p=arr; int i;
int result[4];
printf("请输入字符串");
gets(arr);
int temp=0;int j=0;
for(i=0;i<7;i++){
printf("arr[i]=%c ",*(p+i));
if(*(p+i)>='0'&&*(p+i)<='9'){
temp=temp*10+(*(p+i)-48);
printf("temp=%d ",temp);
if(*(p+i+1)=='\0'){
result[j]=temp;
}
}
else{printf("\n");
result[j]=temp;
printf("1111temp=%d ",temp);
temp=0;
j++;
}
}
for(i=0;i<4;i++){
printf("result[%d]=%d ",i,result[i]);
}
return 0;
}