当前位置: 首页 > article >正文

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);

http://www.kler.cn/a/528535.html

相关文章:

  • 高速稳定,功能强大的免费下载工具!!
  • LeetCode 0040.组合总和 II:回溯 + 剪枝
  • AI学习指南Ollama篇-使用Ollama构建自己的私有化知识库
  • Autogen_core源码:_agent_instantiation.py
  • C++实现状态模式
  • Elasticsearch:如何搜索含有复合词的语言
  • 从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能
  • 交易股指期货有什么技巧吗?
  • C++中的构造器(Constructor)(也称为构造函数)
  • 三、js笔记
  • 扬帆启航于数据结构算法之雅舟旅程,悠然漫步于C++秘境——探索线性表之栈的绮丽定义与精妙实现
  • 10.[前端开发-CSS]Day10-CSS的浮动和flex布局
  • 【LeetCode: 81. 搜索旋转排序数组 II + 二分查找】
  • 汽车中控屏HMI界面,安全和便捷是设计的两大准则。
  • 调音基础学习
  • 【LLM-agent】(task3)数据库对话Agent和RAG接入Agent
  • 【数据结构-前缀树】力扣208. 实现 Trie (前缀树)
  • Baklib揭示内容中台实施最佳实践的策略与实战经验
  • 好用的翻译工具
  • 基于VMware的ubuntu与vscode建立ssh连接
  • java练习(1)
  • 网络编程套接字(中)
  • 力扣动态规划-17【算法学习day.111】
  • 深入解析“legit”的地道用法——从俚语到正式表达:Sam Altman用来形容DeepSeek: legit invigorating(真的令人振奋)
  • 计算机网络之物理层通信基础(编码与调制)
  • java练习(2)