上一章着重讲解了指针与多维数组,这一章要从字符数组下手
我们要做的就是来引用字符数组中的字符串,我们知道%s格式声明可以做到,数组名加下标的组合也可以做到
简单来看一个例子:
#include<stdio.h>
int main(void) {
char string[] = "i love you";
printf("%s\n", string);
printf("%c\n", string[7]);
return 0;
}
输出结果:
上面的例子中只运用了字符数组,接下来字符指针出场:
#include<stdio.h>
int main(void) {
char* p = "i love you";
printf("%s\n", p);
return 0;
}
很简单对吧,结果:
继续:
#include<stdio.h>
int main(void) {
char* p = "i love you";
printf("%s\n", p);
p = "i am a boy";
printf("%s", p);
return 0;
}
在第一次输出完成后再次赋值,结果:
好,继续,这里要求用地址法把字符串a复制给b,然后输出b数组:
#include<stdio.h>
int main(void) {
char a[] = "i love you", b[20];
int i;
for (i = 0; *(a + i) != '\0'; i++) {
*(b + i) = *(a + i);
}
*(b + i) = '\0';//最后到循环无法进行时,也就是a到头了,这时b也要在后面表示结束,所以打上'\0'
printf("string a is:%s\n", a);
printf("string b is:");
for (i = 0; b[i] != '\0'; i++) {
printf("%c", b[i]);
}
printf("\n");
return 0;
}
当然也可以这样:
#include<stdio.h>
int main(void) {
char a[] = "i love you", b[20];
int i;
for (i = 0; *(a + i) != '\0'; i++) {
*(b + i) = *(a + i);
}
*(b + i) = '\0';
printf("string a is:%s\n", a);
printf("string b is:%s\n",b);
return 0;
}
结果都会是:
这个就不做过多解释了
接下来还是这个问题,要引入字符指针来解决
我们先构思一下,嗯,现在需要两个指针分别指向两个字符数组,然后采用同样的方法,把a赋给b
代码如下:
#include<stdio.h>
int main(void) {
char a[] = "i like eating", b[20];
char* p1, * p2;
p1 = a;
p2 = b;
for (; *p1 != '\0'; p1++, p2++) {
*p2 = *p1;
}
*p2 = '\0';
printf("string a is:%s\n", a);
printf("string b is:%s", b);
return 0;
}
结果:
如果你打出这个:
你得反思自己哪里打错了,是不是少加了*之类的错误,导致溢出了
好,接下来我们再加上函数:
还是复制数组的操作,定义一个函数用来调用实现
#include<stdio.h>
void copy(char from[], char to[]);//声明函数
int main(void) {
char a[] = "i am a boy";
char b[] = "she is a girl";
printf("a=%s,b=%s\n", a, b);//打印出来一下原始数组
copy(a, b);//函数引用
printf("a=%s,b=%s", a, b);
return 0;
}
void copy(char from[], char to[]) {
int i=0;
while (from[i] != '\0') {
to[i] = from[i];
i++;
}
to[i] = '\0';//还是要给最后那个弄成结束符,不要忘记
}
这里把b变成了a的复制,结果:
还是一样,我们再加入指针,只需要修改主函数就可以了:
#include<stdio.h>
void copy(char from[], char to[]);//声明函数
int main(void) {
char a[] = "i am a boy";
char b[] = "she is a girl";
char* p1, * p2;
printf("a=%s,b=%s\n", a, b);//打印出来一下原始数组
p1 = a; p2 = b;
copy(p1, p2);//函数引用
printf("a=%s,b=%s", a, b);
return 0;
}
前面的例子是字符数组做的函数形参,也就是void copy(char from[], char to[]),这里面是数组,下面把它改成指针:
#include<stdio.h>
void copy(char from[], char to[]);//声明函数
int main(void) {
char *a = "i am a boy";
char b[] = "i am a girl";
char* p;
printf("a=%s,b=%s\n", a, b);//打印出来一下原始数组
p = b;
copy(a, p);//函数引用
printf("a=%s,b=%s", a, b);
return 0;
}
void copy(char *from, char *to) {
for (; *from != '\0'; from++, to++) {
*to = *from;
}
*to = '\0';//还是要给最后那个弄成结束符,不要忘记
}
这里还有几点疑问,那就是,直接*b然后函数中代b会报错,我这里还在研究,等想通了会补上的,(是我太菜了)。
好,这一章先讲这些,全部是字符指针与字符数组,可能有些啰嗦,全当加强记忆。如有疏漏,还请指正,谢谢。