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

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

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

相关推荐
لا معنى له3 小时前
目标检测的内涵、发展和经典模型--学习笔记
人工智能·笔记·深度学习·学习·目标检测·机器学习
石像鬼₧魂石5 小时前
内网渗透靶场实操清单(基于 Vulhub+Metasploitable 2)
linux·windows·学习·ubuntu
小浣熊熊熊熊熊熊熊丶6 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
啃火龙果的兔子6 小时前
JDK 安装配置
java·开发语言
星哥说事6 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
等....7 小时前
Miniconda使用
开发语言·python
zfj3217 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
醇氧7 小时前
org.jetbrains.annotations的@Nullable 学习
java·开发语言·学习·intellij-idea
Java&Develop7 小时前
Aes加密 GCM java
java·开发语言·python
weixin_462446237 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang