字符串

练习:编写函数把一个数组里所有存储区的内容前后颠倒,假设数组里原有内容是1 2 3 4 5,颠倒后的内容是54321

#if 1
/*
 *数组内容颠倒
 *
 * */
#include<stdio.h>
int *func (int *p_num,int size){
	int *p_start = p_num,*p_end = p_num + size - 1;
	int tmp = 0;
	while (p_start < p_end){
		tmp = *p_start;
		*p_start = *p_end;
		*p_end = tmp;
		p_start++;
		p_end--;
	}
	return p_num;
}
int main (){
	int arr[] = {1,2,3,4,5};
	int *p_num = func(arr,5);
	int num = 0;
	for (num = 0;num <= 4;num++){
		printf("%d ",arr[num]);
		printf("%d ",*(p_num + num));
	}
	printf("\n");
	return 0;
}

#endif 

字符串

C语言里规定所有文字信息必须记录在一组连续的字符类型存储区里,所有文字信息必须用“ \0 ”,字符做结尾,这个字符的asscii码就是0,符合以上两个特征的内容叫做字符串。

字符串里‘ \ 0 ’,字符前面的部分是有效文字信息,所有字符串都可以采用字符类型指针表示。

字符串字面值

字符串字面值是一种字符串,列如

"abc" , "^&*^"

编译器在编译的时候自动在字符串字面值的末尾加上'' \0 ''字符,编译器在编译的时候会把字符串字面值替换成第一个字符所在存储区的地址,字符串字面值的内容在程序执行过程中不可以改变,程序中内容一样的字符串字面值在内存中其实是同一个。多个并列的字符串字面值会被自动合并成一个。

字符数组

字符数组也可以作为字符串使用,只有包含“ \0 ”字符的字符数组才可以作为字符串使用,可以使用字符串字面值对字符数组进行初始化(计算机会把字符串字面值里的“\0”字符也初始化到字符数组里)。

区别

字符数组里的字符串的内容可以修改,字符串字面值在程序执行中不能修改。

如何使用操作字符串

在printf函数调用语句里使用%s做占位符可以把字符串里所有文字显示在屏幕上。%s必须跟地址数据配合使用。不可以使用操作符操作字符串,C语言里提供一组标准函数用来操作字符串,为了使用这些标准函数需要包含string.h头文件。

strlen

​ 用来统计字符串里有效字符个数和sizeof计算结果不同

strcat

用来合并两个字符串,需要两个字符串做参数第一个参数必须是字符,数组里的字符串,把第二个参数里的所有有效字符追加到第一个,参数有效字符的后面,返回值就是第一个参数,可以用来代表合并后的字符串,如果合并后的字符串超过数组的范围,函数就会,修改不属于数组的存储区,这会造成严重错误

strncat

功能和strncat类似,但可以避免出现错误,第三个参数是字符个数

strcmp

用来比较两个字符串的大小,从前向后依次比较对字符,ASCII码大的字符所在的字符串就大,函数有两个参数,各表示一个字符串,返回值表示结果,返回值为1表示前一个字符串大,返回-1表示后一个字符串大,0表示一样大

strncmp

功能和strcmp类似,只能比较两个字符前n个字符

strcpy

把一个字符串里的有效字符复制到字符数组里,如果字符串的长度超过字符数组的长度就会修改不属于数组的存储区,这样会出现严重错误。

strncpy

功能和strcpy类似,但是可以避免出问题。有可能不复制‘ \0 ’字符

memset

用来把字符数组里多个存储区的内容设置成同一个字符

strstr

用来在一个字符串里查找另外一个字符串的位置,如果找不到则返回NULL

以下两个字符串相关函数使用的时候不需要包含string.h头文件

sprintf

按照格式把多个数字合并成一个字符串并记录到字符数组里

sscanf

按照格式从字符串里获得多个数字并记录到存储区里

以下两个字符串相关的函数可以把字符串里的数字转换成数字类型

为了使用这两个函数需要包含stdlib.h头文件

atoi

用来把字符串里开头的整数部分转换成整数类型

atof

用来把字符串里开头的浮点数部分转换成双精度浮点类型

如何从键盘获取字符串

在scanf函数调用语句里使用%s做占位符可以从键盘里得到一个字符串并记录到字符数组里;这种方法有可能造成严重错误(存储区不够,有空格)。

fgets

函数可以从键盘得到一个字符串并记录到字符数组里,这个函数可以避免scanf函数问题。这个函数有三个参数

1.数组米名称

2.数组里存储区个数

3.用stdin表示键盘

如果输入的内容不能把数组充满就会把用户最后输入的换行字符当作‘ \n ’字符也读到数组里。如果输入内容过多,就把无法处理的字符内容都留在输入缓冲区里等下次读取,在每次使用fgets函数从键盘得到字符串以后都应该删除输入缓冲区里可能存在的多余数据。

scanf("%*[^\n]");
scanf("%*c");

只有确定输入缓冲区里包含多于数据的时候才应该去删除这些多余数据。

练习:编写程序从键盘得到多个考试成绩(个数不超过5个),有效考试成绩范围从0-100;把所有考试成绩按照一下格式拼凑成一个字符串:

10,20,30,40,50

把得到的字符串显示在屏幕上

/*
 *字符串练习
 *
 * */
#include<stdio.h>
#include<string.h>
int main() {
	char buf[30] = {0},tmp[10] = {0};
	int grade = 0;
	while(1) {
		printf("请输入一个考试成绩:");
		scanf("%d",&grade);
		if(grade >= 0 && grade <= 100) {
			sprintf(tmp,"%d,",grade);
			strcat(buf,tmp);
		}
		else {
			break;
		}
	}
	buf[strlen(buf) - 1] = 0; 		//最后一个成绩后的逗号删除
	printf("%s\n",buf);
	return 0;
}

练习:编写函数实现atoi函数功能

/*
 *
 *编写函数实现atoi函数的功能
 *
 * */
#include<stdio.h>
#include<string.h>
int myatoi(const char *p_ch) {
	int ret = 0;
	const char *p_tmp = p_ch;


	/*while(*p_tmp >= '0' && *p_tmp <= '9') {
			ret = (10 * ret + *p_tmp - '0');
			p_tmp++;
	}*/

	while(1) {
		if(*p_tmp >= '0' && *p_tmp <= '9') {
			ret = (10 * ret + *p_tmp - '0');
		}
		else {
			break;
		}
		p_tmp++;
	}
	return ret;
}
int main() {
	char buf[10] = {0};
	int num = 0;
	printf("请输入一个字符串:");
	fgets(buf,10,stdin);
	if(strlen(buf) == 9 && buf[8] != '\n') {
		scanf("%*[^\n]");
		scanf("%*c");
	}
	num = myatoi(buf);
	printf("%d\n",num);
	return 0;
}
posted @ 2024-10-27 16:00  GQH1000  阅读(25)  评论(0编辑  收藏  举报