几个指针的小练习

一、指针字符串数组输出

输入:一个指针字符串数组

输出:输出全部字符串

其中包含着字符串输出的常见算法,即while寻找休止符‘\0’,否则不断输出字符,最终将字符串全部输出。

代码:

#include<stdio.h>
#include<stdlib.h>

int main() {
	char* p[] = { "one","two","three","four" };                     //需要操作的数组
	int i;                                                          //计数器
	printf("p的地址是%d\np地址对应的内容是%d\n", p, **p);            //看看p的指针数组名到底指的是啥
	for (i = 0; i < 4; i++) {
		while (*p[i] != '\0') {
			printf("%c", *p[i]++);

		}
		printf("\n");
	}
}

变量显示:

对于指针数组,数组名并不是首地址,如上图所示,原因是指针仅仅作为变量指向首地址(*p或p[0]),对比寻找james中的二维数组变量:

 总结:

1.字符串输出算法

2.指针数组和二维数组的区别

二、用指针操作字符数组练习

输入:字符串

输出:字符串

算法:

(1)先求字符串长度

(2)指针指向数组

(3)基于长度逐个字符复制(*勿漏掉复制休止符‘\0’)

(4)输出字符串

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() {
	char* p;
	char a[100],b[100];                              //字符输入
	gets_s(a);
	int i, lenth = 0;                                       //计数器
	while (a[lenth] != '\0') {                       //计算输入字符串长度(休止符未被考虑进去)
		lenth++;
	}
	p = b;                                           //指针指向输出数组
	for (i = 0; i <= lenth;) {                      //用指针逐个字符复制
		*(p++) = a[i++];                                   //等号右结合,此行代码可拆为三,先赋值,右二左三
	}
	puts(b);                                         //字符输出
	return 0;
}

注意点:

1.for循环中增加操作不要重复,在for中进行或者在命令中进行(采用)

2.gets函数和puts函数头文件是stdio,其他str***用的是string.h

3.等号赋值右结合,先赋值,右二左三

总结:

1.while长度计算算法(也用于输出)

2.典型指针处理(字符)数组

3.for循环和自增命令注意点

4.字符处理函数的使用

三、使用指针代替库函数合并字符

输入:两个字符串

输出:合并后的字符串

算法·:

1.输入两个字符串A,B

2.定义两个指针,一个指向A的开头,一个指向B的开头

3.A指针移动到休止符

4.将B从开头覆盖休止符复制到A中,直到休止符

5.输出字符串A

代码:

#include<stdio.h>
#include<stdlib.h>

int main() {
	printf("字符合并\n");
	char s1[50],s2[20];                         //输入两个字符串
	printf("请输入第一个字符:\n");
	gets_s(s1);
	printf("请输入第二个字符:\n");
	gets_s(s2);
	char* p1, * p2;                             //定义两个指针,一个指向A的开头,一个指向B的开头
	p1 = s1;
	p2 = s2;
	while (*p1 != '\0') {                       //将A指针移动到休止符
		p1++;
	}
	while (*p2 != '\0') {                       //将B从开头覆盖休止符复制到A中,直到休止符
		*(p1++) = *(p2++);
	}
	*(p1++) = *(p2++);                               //*休止符处理
	printf("合并结果:\n");
	puts(s1);                                   //输出字符串A
}

注意:未曾计数数组长度,需要单独处理休止符。当程序复杂的时候,需要对数组进行计数,然后用for循环操作,两次while循环可能出现问题

四、检查字符串的包含关系

输入:待测字符串和目标字符串

输出:出现次数和位置

算法:

1.输入待测字符串和目标字符串

2.定义两个指针分别指向首位

3.寻找目标字符串首位

3.1找到字符串首位后指针偏移检索

3.1.1若成功找到则接着验证下一个字母

3.1.2若未成功则跳出内层循环

4.找到后输出数量和位置

代码:

#include<stdio.h>
#include<stdlib.h>

int main() {
	char sd[100], st[20];                                //输入待测字符串和目标字符串
	gets_s(sd);
	gets_s(st);
	char* pd, * pt;                                      //定义两个指针分别指向首位
	pd = sd;
	pt = st;
	int i=0,n=0;                                                //计数器
	printf("位置有:\n");
	while (*pd != '\0') {                                 //寻找目标字符串首位
		if (*pd == *pt) {                                //找到字符串首位后指针偏移检索
			while (*(pt+i) != '\0') {
				if (*(pt+i) == *(pd+i)) {
					i++;                                 //若成功找到则接着验证下一个字母
				}
				else {
					i = 0;
					break;                               //若未成功则跳出内层循环
				}
			}
			if (*(pt + i) == '\0') {
				printf("%d\n",pd-sd);                      //找到后输出数量和位置
				n++;
				i = 0;

			}
		}
		pd++;
	}
	printf("总数为:%d",n);
    return 0;
}

 总结:

1.while寻找算法是字符串处理的常见算法

2.指针偏移寻找

3.自增的顺序很重要(修改前将p++前置,倒置首位无法检测)

4.字符串匹配算法

对比标准答案:

对比后发现自身问题:

1.for循环也可以完成顺序寻找算法,一定程度上可以代替while
同时,do、for、while其实都可以相互替代,修改命令行可以完成所有

但选择合适的循环命令会显得循环较为规整,能够增强可读性

在本题中计数并用for循环判断是最为合适的,可读性最高

2.要养成求长度的习惯,不要懒得去求长度

3. 前面的顺序寻找没有什么多说的,但是后面的字符串比较存在的很多种算法,本方法效率较低

这个需要去查阅并寻找高效的算法

五、计算稿酬

输入:稿件文件以及名称

输出:稿费(单价*单词数量)

算法思想:

(1)输入文件名称和稿件单词单价

(2)根据文件名称,用文件指针依次读取字符串;

(3)只要文件没有结束,则单词计数器就加1
(4)根据统计出的单词数量和单价,计算稿酬并显示;

代码:

#include<stdio.h>
#include<stdlib.h>

int main() {
	FILE* fp;
	char name[51],str[51];
	float money, total;
	int count = 0;
	printf("\n输入待处理的稿件名称:");
	scanf_s("%s", name, 50);
	printf("\n输入稿费单价/单词:");
	scanf_s("%f", &money);
	fopen_s(&fp, name, "r");
	if (fp == NULL) {
		printf("打开文件失败\n");
		system(" pause");
		return -1;

	}
	while (!feof(fp))
	{
		fscanf_s(fp, "%s", str, 50);
		++count;
	}
	total = count * money;
	printf("稿酬为:%.2f", total);
	fclose(fp);

	system("pause");
	return 0;

}

注意:所读取文件必须保存在程序同名文件夹下才能打开(也可以打开自己)

总结:

1.提供了许多文件操作函数:fopen(打开)、fscanf(读入)、fclose(关闭)、feof(判断)

2.应用while顺序寻找,寻找空集,实现遍历()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值