针对考研的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.结构体内存对齐

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

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

相关推荐
一只路人甲9 小时前
使用AI快速学习
学习
C++ 老炮儿的技术栈9 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程10 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力10 小时前
从0开始配置Perforce4环境
开发语言
Navigator_Z11 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
幸运小圣11 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风11112 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪12 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
Gyr012 小时前
浅刷了一遍51CTO软考题库客观题及其解析(4)
学习·软考·知识点·信息安全工程师
君顾113 小时前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管