字符跟字符串及其获得,打印

本文介绍了C语言中字符和字符串的存储方式,字符获取函数getchar(), getch(), getche()的区别,以及字符串获取函数scanf(), gets(), fgets()的使用。强调了fgets()的安全性和puts()的便利性。还提到了字符处理函数库<ctype.h>中的函数,并给出了几个课后练习题。" 88046450,7727580,Apollo无人驾驶模块详解,"['自动驾驶', '无人驾驶', 'Apollo框架', '路径规划', '车辆控制']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符跟字符串

字符是以数值存储在电脑里(硬盘、内存);这个数值就是二进制数,也就是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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值