C语言--(三)字符串处理(Lellansin)
(10)字符串处理
"" (里面什么都没写)里面存的\0
%c字符
%s字符串
字符要多数出一个\0
下面的第一中学是把第一中学的首地址赋给了字符数组
考虑下char *s = "第一中学" 与 char school[20] = "第一中学" 的区别
下面是把“i am happy”首地址给了hi[]
下面:通过指针直接获得每个字符串首地址
下面:碰到\0就会停止
常用输入输出库stdio.h
连接strcat ()
拷贝strcpy (copy)
比较strcmp (compare)
// strcat()
// 关于char hi[20] 与 char *hi的正确使用
#include<stdio.h>
int main() {
char hi[20] = "hello"; // 这样hi[]是有内存的,而直接使用 char *hi = "hello"是不行的
// 因为*hi 只指向了hello的首地址后面是没有内存的,不能用与连接
// 已经声明好了hi[20]有20个字符串格子,有足够的空间来strcat后面
// 的"Alice"
char *name = "Alice";
char str[256];
printf("%s\n", strcat(hi, name));
}
// 错误示范
#include<stdio.h>
int main() {
char *hi = "hello"; // 这样hi[]是有内存的,而直接使用 char *hi = "hello"是不行的
// 因为*hi 只指向了hello的首地址后面是没有内存的,不能用与连接
char *name = "Alice";
char str[256];
printf("%s\n", strcat(hi, name));
}
strcpy()
// strcpy()
#include<stdio.h>
int main() {
char hi[20] = "hello";
char *name = "Alice";
char str[256] = "alan nihao";
strat(hi, name);
printf("%d", hi);
printf("%s\n", strcpy(str, "come on")); //
}
strcmp()
// strcmp()
#include<stdio.h>
int main() {
char hi[20] = "hello";
char *name = "Alice";
char str[256] = "alan nihao";
strat(hi, name);
printf("%d", hi);
printf("%s\n", strcpy(str, "come on"));
printf("%d\n", strcmp("hello","hello")); // strcmp()返回的是int型的整数 这里是%d
printf("%d\n", strlen(str)); // 返回的是7, come on 没有算上\0
printf("%d\n", strupr(str)); //小写变成大写
}
因为都是hello所以返回0
strcmp("zello", "hello");
比较z和h的ascii码大小
#include<stdio.h>
#include<string,h>
int main() {
do{
printf("please input your password:\n");
scanf("%s", str);
}while(strcmp(str, "asdf1234"));
printf("password is correct\n"); // "asd123"=="asd123"是不行的,貌似因为地址不同
}
sprintf(str, "%s %d", hi, name)
// strcmp()
#include<stdio.h>
int main() {
char hi[20] = "hello";
char *name = "Alice";
char str[256];
printf("%s\n", hi);
sprintf(str, "%s %s", hi, name); // 先赋给%s %s然后都给到str
printf(str);
}
// strcmp()
#include<stdio.h>
int main() {
char hi[20] = "hello";
char *name = "Alice";
char str[256];
printf("%s\n", hi);
sprintf(str, "%s %s", hi, name); // 先赋给占位符%s %s , 然后都给到str
int i;
for(i = 0; i<5; i++) {
sprintf(str, "%s %d", name, i);
printf(str);
}
}
总结
调用自己写的函数,这里使用了省略写法
void function(int *x, int *y) {
}
int main() {
swap(&i, &j);
}
统计字符有几个
#include<stdio.h>
#include<string.h>
int mestrlen(char *aim); // 需要提前声明
int main() {
printf("%d", mystrlen("hello"));
}
int mystrlen(char *aim) { // 如果定义在主函数后面,需要提前声明
int count;
while(*aim != "\0") {
aim++;
count++;
}
return;
}
输出是5
1.另外一种写法
#include<stdio.h>
#include<string.h>
int mestrlen(char *aim);
int main() {
printf("%d", mystrlen("hello"));
}
int mystrlen(char *aim) {
int count;
while(*aim++ != "\0") { // 这里的改动是判断完了再+,所以等同于上面的
count++;
}
return count;
}
结果是5
因为
printf("%d", '\0');
输出是0,就是假
2.另外一种写法
#include<stdio.h>
#include<string.h>
int mestrlen(char *aim);
int main() {
printf("%d", mystrlen("hello"));
}
int mystrlen(char *aim) {
int count;
while(*aim++) { // 这里的改动是判断完了再+,当等于'\0'时就是假,不再循环
count++;
}
return count;
}
结果是5
3.另外一种写法
#include<stdio.h>
#include<string.h>
int mestrlen(char *aim);
int main() {
printf("%d", mystrlen("hello"));
}
int mystrlen(char *aim) {
int count;
while(*aim++) { // 这里的改动是判断完了再+,当等于'\0'时就是假,不再循环
count++;
}
return count;
}
结果是5
4.另外一种写法
#include<stdio.h>
#include<string.h>
int mestrlen(char *aim);
int main() {
printf("%d", mystrlen("asdf"));
}
int mystrlen(char *aim) {
int count;
char *tmp = aim; // 现在aim是hello首地址,给了tmp ?
while(*aim++) { // 这里的改动是判断完了再+,当等于'\0'时就是假,不再循环
count++;
}
return aim-tmp; // 用aim现在新的地址减去原来aim的地址
}
结果是5,因为使用asdf后面的\0 的位置5 减去了首地址=5
如果是"hello world"结果是12
https://www.bilibili.com/video/av395183 62分钟
后面的内容,up主自己没弄清楚~