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

针对考研的C语言学习(定制化快速掌握重点2)

1.C语言中字符与字符串的比较方法

在C语言中,单字符可以用==进行比较也可以用 > , < ,但是字符串却不能用直接比较,需要用strcmp函数。

strcmp 函数的原型定义在 <string.h> 头文件中,其定义如下:

int strcmp(const char *s1, const char *s2);

strcmp 函数的返回值如下:

  • 如果 s1 小于 s2(即 s1 在字典序中排在 s2 之前),返回一个负整数。
  • 如果 s1 等于 s2,返回 0。
  • 如果 s1 大于 s2(即 s1 在字典序中排在 s2 之后),返回一个正整数。
#include <stdio.h>
#include <string.h>

int main() 
{
    const char *str1 = "hello";
    const char *str2 = "world";
    const char *str3 = "hello";

    printf("Comparing '%s' and '%s': %d\n", str1, str2, strcmp(str1, str2)); // 输出负整数
    printf("Comparing '%s' and '%s': %d\n", str1, str3, strcmp(str1, str3)); // 输出 0
    return 0;
}
在这个示例中,strcmp(str1, str2) 会返回一个负整数,因为 "hello" 在字典序中排在 "world" 之前;而 strcmp(str1, str3) 会返回 0,因为两个字符串是相同的。

单字符可以直接比较

对于字符数组进行赋值,只能用strcpy函数进行赋值或者在初始化时赋值

但是对于字符指针可以直接赋值

2.字符数组的一些坑点

先抛出问题

为啥ch数组打印出来是乱码,而ch2打印却好好地。

原因:

printf通过%s 打印字符串时,原理是依次输出每个字符,当读到结束符'\0'时,结束打印;

因为 %s 期望字符串以 \0 结束,所以pirintf输出时,ch找不到结束标志符号,就会内存越界,导致乱码。

因此对于字符串初始化尽量用下面的方式也是最常用的方式,他会自动补'\0';

char str[] = "word";
//或者以下
char str[长度]={0};
strcpy(str,"字符串");

fgets使用方法(更安全)

fgets(char* _Buffer,int _MaxCount,FILE* _Stream);

他会自动截止并且补充结束标志符,第二个参数既是最大长度,但实际存储只能是最大长度-1,因为要留一个给结束标志符。

3.缓冲区的坑

scanf与缓冲区的结合导致的坑!!!

上面图片中为啥是这样呢???

若是scanf读取数据时,分开读取时而读取字符的前面刚好有读取非字符数据时,会在缓冲区残留'\n'-----回车键

因此会把缓冲区的'\n'赋值给下面的字符类型数据,导致数据错误.所以需要再他俩之间进行主动清空缓冲区

同理:fgets使用也会遇到缓冲区的坑!!!

#include<stdio.h>
#include<stdlib.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	//因为接下来要存入的字符串,故要清楚此时缓冲区残留的'\n'
	getchar();
	char* p = (char*)malloc(n);
	fgets(p, n, stdin);
	printf("%s\n", p);
	free(p);
	return 0;
}

4.结构体内存对齐

【注】这里说的最大成员的大小是指的是成员变量的 类型大小 所比的大小

对于考研指导上面的结论即可。但若是想深入了解可以继续看下面解释


http://www.kler.cn/news/327962.html

相关文章:

  • 深度解析 HTTP
  • Linux集群部署RabbitMQ
  • 从Linux系统的角度看待文件-基础IO
  • Linux服务器配置anaconda3,下载torch
  • Brave编译指南2024 MacOS篇-拉取源码前的准备工作(二)
  • 鸿蒙开发(NEXT/API 12)【硬件(外设扩展驱动开发)】驱动开发服务
  • 【算法】模拟:(leetcode)6.Z 字形变换(medium)
  • 数据预处理:数据挖掘的第一步
  • 基于STM32的智能门禁系统
  • OpenCV视频I/O(6)检查视频捕获对象是否已成功打开的函数isOpened()的使用
  • uniapp 微信小程序 微信支付
  • 张量、框架
  • 选择与运用合适工具提升编程效率的秘诀
  • uboot笔记(一):概括/移植等
  • Lagent 自定义你的 Agent 智能体
  • k8s 部署 prometheus
  • Android中级控件
  • Fivetran+Milvus:AI搜索新时代的数据迁移利器
  • 学习记录:js算法(五十):二叉树的右视图
  • 【Preference Learning】Reasoning with Language Model is Planning with World Model
  • mysql学习教程,从入门到精通,SQL 表、列别名(Aliases)(30)
  • Spring Boot框架在甘肃非遗文化网站设计中的运用
  • ubuntu配置python环境
  • 深度学习基础及技巧
  • Linux性能调优技巧
  • 汽车零部件开发流程关键阶段
  • PowerShell无法执行yarn命令
  • Qt_线程介绍与使用
  • Wpf Image 展示方式 图片处理 显示
  • 828华为云征文|华为云 Flexus X 实例初体验