要求:输入:aabbccc
输出:a2b2c3
相关知识点
字符串数组定义
C语言中没有String类型,因此需使用字符串数组代替string。即定义固定长度的字符串数组:
char a[长度];
或者在定义的同时初始化
char a[] = "Hello World";
指针
指针的初始化
char *p;
初始化的同时对指针进行赋值
char *p = &a[0];
原因:p是字符指针,只能指向一个字符。char *p = &a会报错
*p与p
星p表示指针p所指向的地址上的数据,p表示指针指向的地址。
在判断语句及printf函数中使用*p,而需要对指针右移时使用p++。
代码
#include<stdio.h>
int main(void){
char a[10];
int count = 1;
scanf("%s",&a);
char *p = &a[0];
while(*p != NULL){//*p=NULL表示将指针所指地址上的数据赋为空值;p=NULL表示p为空指针,即不指向任何地址
if(*p == *(p+1)){
count++;
p++;
}else{
printf("%c%d",*p,count);
count = 1;
p++;
}
}
return 0;
}
最近在复习算法,返回来看这道题目,发现边界条件的判定不够明显,题目要求的功能和接收参数的scanf函数放在一起总觉得有些怪怪的。
果然还是把主函数和功能函数分开比较合理,所以把这道题目重新写了一遍。
#include<stdio.h>
#define LENGTH 20
void compress_string(char *p) {
if (p == NULL)
return;
if (*p == NULL)
return;
int count = 1;
while (*p != NULL) {
if (*p == *(p + 1)) {
count ++;
p++;
}
else {
printf("%c%d", *p, count);
count = 1;
p++;
}
}
printf("\n");
}
int main(void) {
char a[LENGTH];
printf("请输入字符串:(最长为20)");
scanf("%s", &a);
compress_string(a);
return 0;
}
运行结果:
注意:在while的判断条件中,必须是*p != NULL
而不是p != NULL
。原因在于我们一开始定义字符数组时是给定了长度的(LENGTH = 20
),即便未全部使用,这些内存也是提前分配好的。因此判定条件为p != NULL
时,循环会在char字符数组长度的末尾结束,与输入的字符大小无关了。
while的判断条件为p != NULL
时的运行结果: