学习目标:C语言之字符串学习
- 十天学会C语言
学习内容:
- C语言字符串引入和注意事项
学习时间:
2022.10.17
学习产出:
1.命令行进入D盘,首先是d:.直接进入系统盘,再cd Filename
2.输入一个字符串,可以用数组char 或者 指针 *p ,数组名就是数组的首地址,也是指针。
3.输出一个字符串,可以定义指针,用指针偏移输出,
int data[] = {1,2,3,4,5};
int i;
char data1[] = "hello";
char *pdata = "hello";
for(i=0;i<5;i++){
printf("%c",*(pdata+i));
}
4.直接使用%s输出,puts就是输出一整串字符。
int main()
{
int data[] = {1,2,3,4,5};
int i;
char data1[] = "hello";
char *pdata = "hello";
printf("%s",data1);
putchar('\n');
puts(pdata);
return 0;
}
注意 数组是字符串变量,可以更改,指针是字符串常量,内容不可更改。
#include<stdio.h>
int main()
{
int data[] = {1,2,3,4,5};
int i;
char data1[] = "hello";
char *pdata = "hello";
data1[2] = 'm';
printf("%s",data1);
putchar('\n');
puts(pdata);
*pdata = 'm';
puts("end");
return 0;
}
注意指针操作,(野指针指的是不知道指向指针的哪个位置,比如char *p,并没有明确的内存指向,很危险,影响内存)
5.计算数组里面的元素个数或者计算长度
int main()
{
int data[] = {1,2,3,4,5};
int len;
char data1[] = "hello";
char *pdata = "hello";
len = sizeof(data)/sizeof(data[0]);
printf("%d",len);
return 0;
}
6.注意字符串和字符数组的区别
data1[6] = ('h','e','l','l','0','\0') == data2[] = "hello"
#注意字符串的结束标志
7.sizeof 和strlen 的区别
#include<stdio.h>
#include<string.h>
int main()
{
int data[] = {1,2,3,4,5};
int len;
char data1[] = "hello";
len = sizeof(data)/sizeof(data[0]);
printf("size:%d\n",sizeof(data1));
printf("strlen:%d\n",strlen(data1));
char *p = "hello";
//p是一个char *,sizeof 来计算的时候,得出的是计算机用多少字节来表示一个地址
printf("size:%d\n",sizeof(p));
printf("size:%d\n",sizeof(char));
printf("size:%d\n",sizeof(char *));
printf("strlen:%d\n",strlen(p));
return 0;
}
8. 指针函数返回的是一个指针,函数指针是函数的地址
函数指针
void test()
{
}
void (*p)();
p = test;
9.对于野指针修正,开辟动态的内存
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char *p;//野指针
p = (char *)malloc(1);//p有了具体的内存指向,不属于野指针
*p = 'c';
free(p);
p = NULL;
p = (char *)malloc(12);//分配内存为12
memset(p,'\0',12);
printf("扩容后的地址:%x",p);
int len = strlen("panzhanjie13135143513");
int newlen = len - 12 +1;
realloc(p,newlen);//12字节不够用,给他扩容
printf("扩容后的地址:%x",p);
strcpy(p,"张三13135143513");
puts(p);
puts("end");
return 0;
}
10.字符常用操作函数
#include <string.h>
#include <stdio.h>
//puts自带换行
int main()
{
char *p = "张三";
char str[128] = {'\0'};
puts(p);
printf("%s\n",p);
puts("请输入字符串:");
//scanf("%s",str);
//gets(str);
//strcpy(str,p);
strncpy(str,p,6);
puts(str);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <assert.h>
char *mystrcat(char *des,char *src)
{
assert( des!=NULL && src != NULL);//断言
char *bak = des;
while(*des != '\0')
des++;
while((*des++ = *src++) != '\0')
*des = '\0';
return bak;
}
int main()
{
char str[128] = "张三";
char *p2 = NULL;
char *p = "shuai";
p2 = mystrcat(str,p);
puts(str);
puts(p2);
return 0;
}