1 字符数组
#include<stdio.h>
#include <string.h>
int main() {
char arr[] = { 'h','e','l','l','o' };
int len1 = sizeof(arr); // sizeof(arr[0]); //正确,求字符数组的长度
int len2 = strlen(arr); //错误,产生一个随机数
printf("%d\n", len1); // len1 = 5
printf("%d\n", len2);
}
2 字符串
#include<stdio.h>
#include <string.h>
int main() {
char arr[] = "hello"; // 自动在末尾增加一个'\0
int len1 = sizeof(arr) / sizeof(arr[0]);
int len2 = strlen(arr); // 求有效字符个数,遇到'\0'停止
printf("%d\n", len1);//len1 = 6,算上了'\0'
printf("%d\n", len2);//len2 = 5
}
3 字符数组和字符串的再认识
1、字符数组,就是字符类型的数组。字符数组不一定是字符串。
2、字符串是最后一个字符为’\0’的字符数组。字符串一定是字符数组。
3、字符数组的长度是固定的,其中任何一个字符都可以为’\0’。
4、字符串只能以’\0’结尾,其后的字符便不再属于该字符串。
5、strlen()对字符串完全适用,对不是字符串的字符数组不适用。
4 字符串操作函数
比较/部分比较
strcmp() / strncmp() :相等返回0,不相等返回1
#include<stdio.h>
#include <string.h>
int main() {
char arr[] = "hello";
char brr[] = "hell0";
int flag1 = strcmp(arr, brr); //等价于int flag1 = strcmp("hello", "hell0");
int flag2 = strncmp(arr, brr, 3); //前三个字符进行比较
printf("%d\n", flag1); //1
printf("%d\n", flag2); //0
}
拷贝/部分拷贝
strcpy() / strncpy()
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <string.h>
int main() {
char arr[] = "hello";
char brr[10]={0};
char crr[10]={0};
strcpy(brr, arr);//等价于strcpy(brr, "hello");
strncpy(crr, arr, 3);
printf("%s\n", brr); //hello
printf("%s\n", crr); //hel
}
链接/部分链接
strcat() / strncat()
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <string.h>
int main() {
char arr[20] = "hello";
char crr[20] = "hello";
char brr[] = " world";
strcat(arr, brr);
strncat(crr, brr, 3);
printf("%s\n", arr);//hello world
printf("%s\n", crr);//hello wo
}
5 字符串输入、输出函数
scanf() 和 printf()
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <string.h>
int main() {
char arr[128] = { 0 };
scanf("%s", &arr);
printf("%s\n", arr);
}
scanf(“%s”,&arr)与get_s(arr)区别:如下图,scanf()不允许含有空格,get_s()允许含有空格。
gets_s() 和 puts()
#include<stdio.h>
#include <string.h>
int main() {
char arr[128];
gets_s(arr);
puts(arr);
}
fgets()和fputs()
#include<stdio.h>
#include <string.h>
int main() {
char arr[128];
fgets(arr,128,stdin);
fputs(arr, stdout);
}
sscanf()和sprintf()
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int n1=0;
int n2=456;
char arr[128]="123";
char brr[128];
sscanf(arr, "%d", &n1);//将字符串类型的arr以整数形式输入到n1中(从左往右)
sprintf(brr, "%d", n2);//将int型的n2以字符串的形式输入到brr中(从右往左)
printf("%d\n", n1); //123
printf("%s\n", brr); //456
}
6 memset()函数
memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值,这个函数通常为新申请的内存做初始化工作。即:作用是在一段内存中填充某个给定的值,是对较大的结构体或数组进行清零操作的一种最快方法。
#include<stdio.h>
#include <corecrt_memory.h>
int main() {
int arr[5];
int i;
memset(arr, 0, sizeof(arr));
for (int i = 0; i < 5; i++) {
printf("%3d", arr[i]);
}
printf("\n");
memset(arr, -1, sizeof(arr));
for (int i = 0; i < 5; i++) {
printf("%3d", arr[i]);
}
}
注意:memset函数按字节对内存块进行初始化,所以它不能将int数组初始化为0和-1之外的其他值。赋其他的数据时,会出现错误。如下:
memset(arr, 1, sizeof(arr));
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}