2025_2_1 C语言中关于字符串
1.字符串
C语言中的字符串都是字符数组,以空字符 ‘\0’结尾。
创建一个字符数组必须以空字符结尾,不然会访问非法区域,直到找到\0为止
char c[] = {'a', 'b', 'c', '\0'};
长度为n的字符串字面值,会存储在虚拟内存中的只读数据段中,分配n+1长度的字符数组,用来存储字符数组和一个空字符。
int main() {
char* p = "Hello";
printf("%c", *p);
return 0;
}
字符串被视为字符数组,所以该字符数组的首元素地址就是字符串数组名即字符串名。
而且是该指针是指向常量的指针,即不能通过该指针修改常量里面的值。
int arr[] = { 1,2,3 };
arr[1] = 6;
char c[] = { 'a','b','c','\0' };
//char c[] = "abc",也是正确写法,与上面大括号的声明一样
c[1] = 'd';
char* pc = "abc";
pc[1] = 'd';//错误
字符数组可以改变其中的值,但字符串不能,字符串被看为是字符数组
所以:
如果需要一个可以修改的字符串,就必须使用字符数组的形式来声明初始化字符串,也就是字符串变量
2.字符串长度的计算
在C语言中可以使用标准库函数strlen() 来计算字符串的长度,这个函数不将\0加入计算
char* p = "abcd";
printf("%d\n", strlen(p));
char c[] = "abcd";
printf("%d\n", strlen(c));
char d[] = { 'a', 'b', 'c', 'd', '\0' };
//结果都输出4
printf("%d\n", strlen(d));
当然也可以使用for循环来计算
int size = 0;
for (int i = 0; p[i] != '\0'; i++) {
size++;
}
3.字符串的写入问题
字符串可以用scanf和gets, fgets函数写入
- scanf()
scanf函数用于输入字符串的占位符是%s,但是直接使用%s去写入是不安全的,所以一般加上限定长度
缺点: scanf 在读取字符串时,遇到空格(包括空格、制表符\t、换行符\n等空白字符)会停止读取
scanf("%99s", c);//c是字符串指针
-
gets
gets函数完全没有安全检测机制,如果输入的字符串长度大于最大限定长度,直接会发生错误,它用于读取一整行的内容 -
fgets
fgets 是C语言标准库中的一个函数,用于从输入流中读取一行字符串,包括空格和换行符。它比 gets 更安全,因为它允许指定缓冲区的大小,从而避免缓冲区溢出。
printf("请输入一行字符串:");
fgets(pc, sizeof(pc), stdin);
printf("%s\n", pc);
char* pc = (char*)malloc(sizeof(char) * 100);
if (pc == NULL) {
printf("内存分配失败!\n");
return 1;
}
/*printf("请输入字符串:");
scanf("%99s", pc);
gets(pc);*/
//printf("%s\n", pc);
//free(pc);
printf("请输入一行字符串:");
fgets(pc, sizeof(pc), stdin);
printf("%s\n", pc);