字符串
看一看,总的来说,图片所得很清楚了
代码上一哈,你们看的更清楚
#include <stdio.h>
void main()
{
int i;
char a[] = {'s','m','a','l','l'};
char a2[] = "small";//可以修改
char *pchar = "small";//字符串常量,不允许修改
a2[2] = 'e';
//遍历方法
puts(a);
printf("%s\n",a2);
//遍历方法
puts(pchar);
//遍历方法
for(i = 0;i < 5;i++){
printf("%c",a[i]);
//printf("%c",a2[i]);
//printf("%c",*(pchar+i));
}
}
字符串的的内存存放方式及结束标志
都是概念
记住 是以 "\0" 结尾
在你打印字符串长度的时候有可能会出错呦
sizeof和strlen 的区别
| 区别 | sizeof 函数 | strlen 函数 |
|---|---|---|
| 作用 | 返回内存中一个变量或类型所占用的字节数 | 返回一个字符串的长度,不包括字符串末尾的空字符 |
| 参数 | 可以接受任何类型的参数,包括变量、常量、类型名等 | 只能接受一个字符串作为参数,不能接受其他类型的参数 |
| 计算方式 | 在编译时计算,返回变量或类型的字节数 | 在运行时计算,从字符串开头开始扫描,直到遇到空字符为止 |
| 返回值 | 返回一个整数,表示变量或类型在内存中所占用的字节数 | 返回一个整数,表示字符串中字符的个数,不包括空字符 |
| 用途 | 用于计算数据类型或变量在内存中所占用的空间大小 | 用于获取字符串的长度,通常用于字符串处理中 |
上代码:
#include <stdio.h>
#include <string.h>
int main()
{
char a[223] = "small";
printf("sizeof :%d\n",sizeof(a));
printf("strlen :%d\n",strlen(a));
char *p = "small";
printf("sizeof :p :%d\n",sizeof(p));
printf("sizeof :char * :%d\n",sizeof(char *));
printf("sizeof :int * :%d\n",sizeof(int *));
printf("sizeof :char :%d\n",sizeof(char));
printf("strlen : :%d\n",strlen(p));
}
清楚明白❤💕
动态开辟字符串(malloc)
废话先上:
| 函数名 | malloc() |
|---|---|
| 功能 | 在堆内存中动态分配指定大小的内存空间 |
| 头文件 | stdlib.h |
| 原型 | void *malloc(size_t size); |
| 参数 | size:需要分配的内存大小(以字节为单位) |
| 返回值 | 返回一个指向 void 类型的指针,指向分配的内存空间的首地址;如果内存分配失败,则返回 NULL |
| 注意事项 | malloc() 函数只分配内存空间,但不会进行初始化。使用完毕后,应该使用 free() 函数来释放 |
| 内存空间。 |
相关API:
| API | 描述 | 例子 |
|---|---|---|
malloc(size) | 动态分配内存,创建指定大小的字符串存储空间 | char *str = (char*)malloc(sizeof(char) * 20); |
realloc(ptr, new_size) | 重新分配内存,增加或减少字符串存储空间 | str = (char*)realloc(str, sizeof(char) * 30); |
strcpy(dest, src) | 复制字符串 src 到字符串 dest | strcpy(str1, str2); |
strcat(dest, src) | 将字符串 src 追加到字符串 dest 的末尾 | strcat(str1, str2); |
strlen(str) | 返回字符串 str 的长度 | int len = strlen(str); |
strcmp(str1, str2) | 比较字符串 str1 和字符串 str2 是否相等 | int result = strcmp(str1, str2); |
strchr(str, ch) | 在字符串 str 中查找字符 ch | char *ptr = strchr(str, 'a'); |
strstr(str1, str2) | 在字符串 str1 中查找字符串 str2 | char *ptr = strstr(str1, str2); |
memset(ptr, value, num) | 将 ptr 所指向的内存区域的前 num 个字节的值设为 value | memset(str1, 0, sizeof(str1)); |
free(ptr) | 释放动态分配的内存 | free(str); |
其中,
size和new_size表示所需的内存大小,ptr表示指向动态分配内存的指针,dest和src表示要操作的字符串,ch表示要查找的字符,str1和str2表示要查找或比较的字符串。
示例代码:
#include<stdio.h>
#include <string.h>
#include<stdlib.h>
//chat *strcpy(char" dest, const chat tercl:
int main()
{
char*p;//野指针
p = (char*)malloc(1);//p有了具体的内存指向
*p = 'c';
free(p); //放开
p = NULL;
p = (char*)malloc(12);
printf("扩容地址:%x\n",p);
int len =strlen("smallsnake1234234i273");
int newLen = len-12+1;
realloc(p,newLen);
printf("扩容后地址:%x\n",p);
strcpy(p,"smallsnake1234234i273");
puts(p);
puts("end");
return 0;
}
相关API(集合)
| API | 描述 | 例子 |
|---|---|---|
| printf | 输出格式化的字符串到标准输出 | printf("Hello, %s!", name); |
| fprintf | 输出格式化的字符串到指定文件流 | fprintf(file, "Error: %s", message); |
| scanf | 从标准输入读取格式化的数据 | scanf("%d", &num); |
| fscanf | 从指定文件流读取格式化的数据 | fscanf(file, "%d %f", &num, &price); |
| atoi | 将字符串转换为整数 | int num = atoi(str); |
| atof | 将字符串转换为浮点数 | float num = atof(str); |
| strcpy | 复制字符串 src 到字符串 dest | strcpy(str1, str2); |
| strncpy | 复制字符串 src 到字符串 dest,最多 n 个字符 | strncpy(str1, str2, n); |
| strcat | 将字符串 src 追加到字符串 dest 的末尾 | strcat(str1, str2); |
| strncat | 将字符串 src 追加到字符串 dest 的末尾,最多追加 n 个字符 | strncat(str1, str2, n); |
| strcmp | 比较字符串 str1 和字符串 str2 是否相等 | int result = strcmp(str1, str2); |
| strncmp | 比较字符串 str1 和字符串 str2 前 n 个字符是否相等 | int result = strncmp(str1, str2, n); |
| strchr | 在字符串 str 中查找字符 ch | char *ptr = strchr(str, ch); |
| strrchr | 在字符串 str 中从后往前查找字符 ch | char *ptr = strrchr(str, ch); |
| strstr | 在字符串 str1 中查找字符串 str2 | char *ptr = strstr(str1, str2); |
| strtok | 分割字符串 str,返回下一个子字符串 | char *ptr = strtok(str, delim); |
| sscanf | 从字符串 str 中读取格式化的数据 | sscanf(str, "%d %f", &num, &price); |
| fgets | 从指定文件流中读取一行 | fgets(buffer, size, file); |
| puts | 输出字符串到标准输出 | puts(str); |
| strtok | 分割字符串,返回下一个子字符串 | char str[] = "apple,banana,orange";char *ptr = strtok(str, ",");while (ptr != NULL) {printf("%s\n", ptr);ptr = strtok(NULL, ",");} |
| strchr | 在字符串中查找字符 | char str[] = "Hello, world!";char *ptr = strchr(str, 'o');printf("%s\n", ptr); |
| strrchr | 在字符串中从后往前查找字符 | char str[] = "Hello, world!";char *ptr = strrchr(str, 'o');printf("%s\n", ptr); |
| strstr | 在字符串中查找子字符串 | char str[] = "The quick brown fox jumps over the lazy dog";char *ptr = strstr(str, "brown");printf("%s\n", ptr); |
malloc(size) | 动态分配内存,创建指定大小的字符串存储空间 | char *str = (char*)malloc(sizeof(char) * 20); |
realloc(ptr, new_size) | 重新分配内存,增加或减少字符串存储空间 | str = (char*)realloc(str, sizeof(char) * 30); |
strcpy(dest, src) | 复制字符串 src 到字符串 dest | strcpy(str1, str2); |
strcat(dest, src) | 将字符串 src 追加到字符串 dest 的末尾 | strcat(str1, str2); |
strlen(str) | 返回字符串 str 的长度 | int len = strlen(str); |
strcmp(str1, str2) | 比较字符串 str1 和字符串 str2 是否相等 | int result = strcmp(str1, str2); |
strchr(str, ch) | 在字符串 str 中查找字符 ch | char *ptr = strchr(str, 'a'); |
strstr(str1, str2) | 在字符串 str1 中查找字符串 str2 | char *ptr = strstr(str1, str2); |
memset(ptr, value, num) | 将 ptr 所指向的内存区域的前 num 个字节的值设为 value | memset(str1, 0, sizeof(str1)); |
free(ptr) | 释放动态分配的内存 | free(str); |
字符串常用操作函数第一部分
注释掉的部分大叫可以打开自己用一下
#include <stdio.h>
#include <string.h>
int main()
{
char *p = "smallsnake";
char str[21] = "\0";
puts(p);
printf("%s\n",p);
//scanf("%s",str);
//gets(str);
strncpy(str,p,strlen(p));
puts(str);
return 0;
}
实现字符串拷贝函数
#include <stdio.h>
#include <string.h>
//方法一
/*char *myStrcpy(char *des,char *src)
{
if(des == NULL || src == NULL){
return NULL;
}
char *bak = des;
while(*src != '\0'){
*des = *src;
des++;
src++;
}
*des = '\0';
}*/
//方法二
/*char *myStrcpy(char *des,char *src)
{
if(des == NULL || src == NULL){
return NULL;
}
char *bak = des;
while(*src != '\0'){
*des++ = *src++;
}
*des = '\0';
}*/
//方法三
char *myStrcpy(char *des,char *src)
{
if(des == NULL || src == NULL){
return NULL;
}
char *bak = des;
while((*des++ = *src++) != '\0');
*des = '\0';
}
int main()
{
char str[999] = "\0";
char *p = "smallsnake";
myStrcpy(str,p);
puts(str);
return 0;
}
断言函数(assert)--面试可能被问到
代码
#include <stdio.h>
#include <string.h>
#include <assert.h>
char *myStrcpy(char *des,char *src)
{
assert(des != NULL && src != NULL);
char *bak = des;
while(*src != '\0'){
*des = *src;
des++;
src++;
}
*des = '\0';
}
int main()
{
char str[999] = "\0";
char *p = "smallsnake";
char *pp = NULL;
myStrcpy(pp,p);//pp你切换一下str你就会发先没有报错,也可以吧p搞成空的
puts(str);
return 0;
}
讲解
assert是 C 语言中的一个宏,用于在程序运行时检查某个条件是否为真,如果为假则终止程序运行并打印出错信息。如果条件为真,则assert不执行任何操作,程序继续正常运行。assert通常用于调试程序,帮助程序员在出错时快速定位问题。注释:
在编程中,宏(Macro)是一种预处理器指令,用于定义代码中的一个符号或代码片段。当程序中遇到该符号或代码片段时,预处理器会自动将其替换为指定的代码。宏在代码中常用于定义常量、宏函数等。使用宏可以提高代码的可读性和可维护性,并且可以避免代码中出现重复的代码片段。
字符串的拼接(strcat)
代码
#include <stdio.h>
#include <string.h>
//方法一
void mystrcat(char *des, const char *src) {
int len = strlen(des);
int i;
for (i = 0; *(src + i) != '\0'; i++) {
*(des + len + i) = *(src + i);
}
*(des + len + i) = '\0';
}
//方法二
void mystrcat2(char *des, const char *src) {
char *bak = des;
while(*des != '\0'){
des++;
}
while((*des++ = *src++) != '\0');
*des = '\0';
}
int main()
{
char str[222] = "small";
char *p = " snake";
//strcat(str, p);
mystrcat(str, p);
puts(str);
return 0;
}
字符串的比较(strcmp)96节
代码
#include <stdio.h>
#include <string.h>
int main()
{
char *p1 = "smallsnake";
char *p2 = "SmallSnake";
int ret1 = strcmp(p1, p2);
printf("%d\n",ret1);
char *p3 = "SmallSnake";
char *p4 = "smallsnake";
int ret2 = strcmp(p3, p4);
printf("%d\n",ret2);
char *p5 = "smallsnake";
char *p6 = "smallsnake";
int ret3 = strcmp(p5, p6);
printf("%d\n",ret3);
return 0;
}
字符串完结,兄弟们C语言快完了,冲啊!!!!