一、指针字符串数组输出
输入:一个指针字符串数组
输出:输出全部字符串
其中包含着字符串输出的常见算法,即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顺序寻找,寻找空集,实现遍历()