C
文章平均质量分 67
zsx0728
这个作者很懒,什么都没留下…
展开
-
C++ sort() 函数的介绍并与C qsort() 的比较
文章目录sort() 介绍如何按降序排序?如何按特定顺序排序?qsort 和 sort() 的比较参考文档sort() 介绍 C++ STL提供了类似C语言中 qsort() 的函数排序,它对向量或数组进行排序,其中数组中的项是随机排列的。 sort() 函数通常需要两个参数,第一个参数是数组/向量开始排序的位置,第二个参数是我们希望数组/向量排序的长度。第三个参数是可选的,可以在我们想按字典顺序对元素排序的情况下使用。 默认情况下,sort() 函数按升序对元素进行排序。翻译 2021-07-07 15:10:18 · 381 阅读 · 0 评论 -
在C语言中使用fflush(stdin)
fflush() 通常仅用于输出流。它的目的是清除(或刷新)输出buffer,并将缓冲的数据移动到控制台(在stdout的情况下)或磁盘(在文件输出流的情况下)。下面是它的语法。fflush(FILE *ostream);ostream 指向一个输出流或一个更新流,其中最近的操作不是输入。fflush函数会导致将该流的任何未写入数据传递到主机环境,并写入该文件;否则,行为未定义。我们可以将它用于像 stdin 这样的输入流吗? 根据 C 标准,使用 fflush(stdin) 是未定翻译 2021-07-03 17:45:50 · 22435 阅读 · 0 评论 -
C语言中%d和%i格式说明符之间的差异
由百分比符号 (%) 形成的序列表示格式说明符,用于指定要从流中检索并存储到附加参数所指位置的数据的类型和格式。简而言之,它告诉我们要存储哪种类型的数据以及要打印哪种类型的数据。 示例:如果要使用 scanf() 和 printf() 函数读取和打印整数,则使用 %i 或 %d,但在 %i 和 %d 格式说明符中存在细微差别。%d 指定有符号十进制整数,%i 指定整数在 printf 中,%d 和 %i 的行为相同 printf 的 %i 和 %d 格式说明符之间没有区别。考虑翻译 2021-06-30 16:53:00 · 5345 阅读 · 0 评论 -
getc()、getchar()、getch() 和 getche() 的区别
所有这些函数都从输入中读取一个字符并返回一个整数值。返回整数以容纳用于指示失败的特殊值。EOF值通常用于此目的。getc() 它从给定的输入流中读取单个字符,并在成功时返回相应的整数值(通常是读取字符的ASCII值)。失败时返回EOF。 语法:int getc(FILE *stream); 示例:// Example for getc() in C#include <stdio.h>int main(){printf("%c", getc(stdi翻译 2021-06-29 14:36:57 · 5739 阅读 · 0 评论 -
printf、sprintf和fprintf有什么区别?
printf printf函数用于在标准输出控制台上打印数据的字符流。 语法:int printf(const char* str, ...); 示例:// simple print on stdout#include<stdio.h>int main(){printf("hello geeksquiz");return 0;} 输出:hello geeksquizsprintf 语法:int sprintf(char *str翻译 2021-06-27 16:52:10 · 189 阅读 · 0 评论 -
printf() 中 %n 的用途是什么?
在C printf() 中,%n是一个特殊的格式说明符,它不打印某些内容,printf() 统计出现在 %n 之前的字符数,并将该值赋值给参数变量。#include<stdio.h>int main(){int c;printf("geeks for %ngeeks ", &c);printf("%d", c);getchar();return 0;} 上面的程序打印“geeks for geeks 10”。第一个 printf() 打印“geek翻译 2021-06-22 10:04:11 · 12187 阅读 · 3 评论 -
puts() 与 printf() 的对比
在C中,给定一个字符串变量str,应该首选下面哪一个用于将str打印到标准输出?1) puts(str);2) printf(str); puts() 可以优先用于打印字符串,因为它通常成本较低(puts() 的实现通常比printf() 简单),并且如果字符串具有格式化字符(如“%s”),则 printf() 将给出意外的结果。另外,如果str是用户输入字符串,那么使用 printf() 可能会导致安全问题。 还要注意 puts() 将光标移动到下一行。如果不希望光标移到下翻译 2021-06-21 16:15:03 · 646 阅读 · 0 评论 -
C中的扫描集
scanf系列函数支持由%[]表示的扫描集说明符。在扫描集内部,我们可以指定单个字符或字符范围。在处理扫描集时,scanf将只处理那些属于扫描集的字符。我们可以通过将字符放在方括号内来定义扫描集。请注意,扫描集区分大小写。 我们还可以通过在要添加的字符之间提供逗号来使用扫描集。 示例:scanf(%s[A-Z,_,a,b,c]s,str); 这将扫描扫描集中所有指定的字符。 让我们举个例子看看。下面的示例只将大写字母存储到字符数组“str”中,任何其他字符都不会存储在翻译 2021-06-17 15:35:20 · 378 阅读 · 0 评论 -
malloc与calloc的区别及实例
名称malloc和calloc是动态分配内存的库函数。这意味着在程序运行时从堆段分配内存。初始化 malloc()分配给定大小(以字节为单位)的内存块,并返回一个指向块开头的指针。malloc()不会初始化分配的内存。如果在初始化之前我们尝试访问内存块的内容,那么我们将得到分段错误(或者可能是垃圾值)。void* malloc(size_t size); calloc()分配内存并将分配的内存块初始化为零。如果我们尝试访问这些块的内容,那么我们将得到 0。void* call翻译 2021-06-09 15:03:23 · 1630 阅读 · 0 评论 -
在C语言中,如何在不使用free的情况下释放内存?
问题:如何在不使用free()函数的情况下释放动态分配内存? 解决方案:标准库函数realloc()可用于释放以前分配的内存。下面是“stdlib.h”中“realloc()”的函数声明:void *realloc(void *ptr, size_t size); 如果“size”为零,则调用realloc相当于free(ptr)。如果“ptr”为NULL,size为非零,那么调用realloc就相当于malloc(size)。 让我们用简单的例子来检验一下:/* co翻译 2021-06-01 21:45:31 · 417 阅读 · 2 评论 -
了解C语言中的extern关键字
https://www.geeksforgeeks.org/understanding-extern-keyword-in-c/我相信这篇文章对C初学者和精通C的人来说都是一样有趣和有用的。首先,extern关键字适用于C变量和C函数。extern关键字扩展了C变量和C函数的适用范围,这可能就是它被命名为extern的原因。尽管大多数人可能理解变量或函数的“声明”和“定义”之间的区别,但是为了完整起见,我想对其进行澄清。变量或函数的声明只是声明变量或函数存在于程序中的某个地方,但内存没有分配给它们。翻译 2021-05-29 06:37:33 · 390 阅读 · 0 评论 -
C中的static变量
静态变量有一个属性,即使在超出其作用域后也能保持其值!因此,静态变量在其先前的作用域中保留其先前的值,并且不会在新的作用域中再次初始化。 语法:static data_type var_name = var_value; 以下是有关C中静态变量的一些有趣事实。 1. 程序运行时,静态int变量仍保留在内存中。当声明了该变量的函数调用结束时,普通或auto变量将被销毁。 例如,我们可以使用static int来计算函数被调用的次数,但是auto变量不能用于此目的。翻译 2021-05-27 11:04:48 · 290 阅读 · 0 评论 -
C中的类型转换
类型转换基本上是从一种类型到另一种类型的转换。类型转换有两种: 1.隐式类型转换 也称为“自动类型转换”。由编译器自行完成,无需用户进行任何外部触发。通常在表达式中存在多个数据类型时发生。在这种情况下,进行类型转换(类型提升)以避免数据丢失。变量的所有数据类型都升级为数据类型最大的变量的数据类型。 bool -> char -> short int -> int -> unsigned int -> long -&翻译 2021-05-21 17:41:41 · 698 阅读 · 3 评论 -
C/C++中数据类型和修饰符的有趣事实
下面是一些关于数据类型和与数据类型相关联的修饰符的逻辑和有趣的事实: 1.如果没有给变量指定数据类型,编译器会自动将其转换为int数据类型。#include <stdio.h>int main(){ signed a; signed b; // size of a and b is equal to the size of int printf("The size of a is %d\n", sizeof(a)); printf("The size of b翻译 2021-05-20 12:22:20 · 453 阅读 · 0 评论 -
C中的size_t数据类型是什么?
https://www.geeksforgeeks.org/size_t-data-type-c-language/size_t是一种无符号整数数据类型,在各种头文件中定义,例如:<stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>, <wchar.h>它是一种用于表示对象大小(以字节为单位)的类型,因此sizeof运算符将其用作返回类型。它需要足够大,以容纳主机系统能够翻译 2021-05-19 09:48:18 · 2684 阅读 · 0 评论 -
C和C++是否需要“long”数据类型?
在C和C++中,有四种不同的数据类型可用于保存整数,即short,int,long和long long。每种数据类型都需要不同的内存。 但是有一个问题,与其他数据类型不同,“long”数据类型的大小不是固定的。它随体系结构,操作系统甚至我们使用的编译器而变化。在某些系统中,它的表现类似于int数据类型或long long数据类型,如下所示: OS Architecture SizeWindows IA-32翻译 2021-05-18 16:15:11 · 497 阅读 · 0 评论 -
C语言中float值的比较
预测以下C程序的输出:#include<stdio.h>int main(){ float x = 0.1; if (x == 0.1) printf("IF"); else if (x == 0.1f) printf("ELSE IF"); else printf("ELSE");} 上面程序的输出是“ ELSE IF”,这意味着表达式“ x == 0.1”返回false,表达式“ x == 0.1f”返回true。 让我们考虑以下程序,以翻译 2021-05-14 22:01:15 · 1923 阅读 · 0 评论 -
C语言中的整数提升
有些数据类型(如char、short int)占用的字节数比int少,当对这些数据类型执行操作时,它们会自动升级为int或unsigned int。这称为整数提升。例如,在char、short和enum等较小类型上不会进行算术计算。首先将它们转换为int或unsigned int,然后对它们进行算术运算。如果int可以表示原始类型的所有值,则该值将转换为int。 否则,它将转换为unsigned int。 例如,请参见以下程序。#include <stdio.h>int ma翻译 2021-05-12 17:33:07 · 744 阅读 · 0 评论 -
在C语言中使用bool
C语言的C99标准支持布尔变量。在C++中不需要使用头文件来使用bool,在C语言中必须包含头文件“ stdbool.h”才能使用bool。如果将以下程序保存为.c文件,则不能进行编译。int main(){bool arr[2] = {true, false};return 0;} 如果在上述程序中包含头文件“ stdbool.h”,它将作为C程序正常运行。#include <stdbool.h>int main(){ bool arr[2] = { tru翻译 2021-05-05 11:15:00 · 29650 阅读 · 0 评论 -
C语言中的数据类型
https://www.geeksforgeeks.org/data-types-in-c/翻译 2021-05-03 19:46:15 · 186 阅读 · 0 评论 -
C语言中将变量声明为常量的不同方法
有许多不同的方法使变量成为常量。 1.使用关键字 const:const关键字指定变量或对象值是常量,并且在编译时不能修改。// C program to demonstrate const specifier#include <stdio.h>int main(){ const int num = 1; num = 5; // Modifying the value return 0;} 程序将抛出以下错误:error: assignment of翻译 2021-05-01 16:39:18 · 8165 阅读 · 0 评论 -
C语言中的复杂声明
大多数情况下,声明很容易读取,但是很难读取一些包含指向函数的指针的声明。例如,考虑以下来自“signal.h”的声明:void (*bsd_signal(int, void (*)(int)))(int); 让我们看看阅读复杂声明的步骤: 1) 将C声明转换为后缀格式并从右向左读取。 2) 要将表达式转换为后缀,请从最里面的圆括号开始,如果不存在最里面的圆括号,则从声明名称开始,然后向右。当遇到第一个结束括号时向左。一旦整个括号被解析,就从括号中跳出来。 3) 继翻译 2021-04-27 14:40:31 · 505 阅读 · 0 评论 -
链接器如何解析在多个位置定义的全局符号?
https://www.geeksforgeeks.org/how-linkers-resolve-multiply-defined-global-symbols/翻译 2021-04-19 14:26:12 · 198 阅读 · 0 评论 -
关于C中宏和预处理器的有趣事实
在C程序中,以#开头的所有行均由预处理器处理,预处理器是由编译器调用的特殊程序。“#”符号用于处理程序中其他语句之前的功能,也就是说,这意味着它在运行时之前或在编译时处理某些代码。用最基本的术语来说,预处理器获取一个C程序并生成另一个没有任何#的C程序。以下是有关C中预处理器的一些有趣事实。1)当我们使用 include 指令时,头文件(经过预处理)的内容被复制到当前文件中。尖括号< >指示预处理器在保存所有头文件的标准文件夹中查找。双引号“ ”指示预处理器查看当前文件夹(当前目录)。2翻译 2021-04-14 21:46:20 · 103 阅读 · 0 评论 -
C程序的内存布局
C程序的典型内存表示包括以下部分。文本段(Text segment)初始化的数据段(Initialized data segment)未初始化的数据段(Uninitialized data segment)栈(Stack)堆(Heap)运行过程的典型内存布局1.文本段:文本段,也称为代码段或简单地称为文本,是目标文件或内存中程序的一部分,其中包含可执行指令。作为内存区域,文本段可以放在堆或栈的下面,以防止堆和栈溢出覆盖它。通常,文本段是可共享的,因此对于频繁执行的程序(例如文本编辑器翻译 2021-04-13 13:22:50 · 175 阅读 · 0 评论 -
C/C++中“int main()”和“int main(void)”的区别
考虑main()的以下两个定义。int main(){/* */return 0;} 和int main(void){/* */return 0;} 有什么区别? 在C ++中,没有区别,两者相同。 这两个定义在C语言中也都适用,但是第二个带有void的定义在技术上被认为是更好的,因为它清楚地指定只能在没有任何参数的情况下调用main。 在C语言中,如果函数声明没有指定任何参数,则意味着可以使用任意数量的参数或不使用任何参数来调用函数。翻译 2021-04-12 14:32:02 · 5113 阅读 · 0 评论 -
const int *,const int * const和int const *之间的区别
文章目录int const*https://www.geeksforgeeks.org/difference-between-const-int-const-int-const-and-int-const/?ref=rpint const*int const* 是指向常量整数的指针。这意味着被声明的变量是指向常量整数的指针。实际上,这意味着指针指向了不应更改的值。在这种情况下,const限定符不会影响指针,因此允许指针指向其他地址。第一个const关键字可以放在数据类型的任何一侧,因此int c翻译 2021-04-11 18:19:45 · 5098 阅读 · 1 评论 -
C语言中的I/O系统调用(Create, Open, Close, Read, Write)
文章目录重要术语I/O系统调用1. Create2. open3. close4. read5. write参考文档重要术语 什么是文件描述符? 文件描述符是整数,用于唯一标识进程的打开文件。 文件描述符表:文件描述符表是整数数组索引的集合,这些整数数组的索引是文件描述符,整数数组的元素是指向文件表条目的指针。操作系统为每个进程提供了一个唯一的文件描述符表。 文件表条目:文件表条目是打开文件的内存代理结构,当进程请求打开文件时创建,同时这些条目记录文件位置。 标准翻译 2021-04-07 16:20:18 · 2462 阅读 · 0 评论 -
在Linux上用C语言创建静态和动态链接库
静态链接和动态链接是收集和组合多个对象文件以创建单个可执行文件的两个过程。链接既可以在编译时执行,也可以当源代码转换并加载机器代码时执行,也可以当程序被加载到内存并由加载器执行时执行,甚至可以在运行时由应用程序执行。同时,它由被称为链接器的程序执行。链接器也称为链接编辑器,链接是编译程序的最后一步。在本教程中,将讨论C模块的静态和动态链接。翻译 2021-03-31 14:01:20 · 403 阅读 · 0 评论 -
了解C语言中的typedef
文章目录1. typedef的定义与作用域2. 为指针定义别名3. 为数组定义别名4. 为结构体定义别名5. typedef vs #define6. typedef的优点参考文档(翻译文,内容有删改)1. typedef的定义与作用域 typedef是允许我们为现有类型或用户定义的类型创建别名,格式为:typedef <existing_names_of_datatype> <alias__userGiven_name>; 示例:typedef int m翻译 2021-03-28 19:37:10 · 507 阅读 · 1 评论 -
了解C语言中的pipe()系统调用
文章目录基本概念父子进程共享管道参考文档基本概念 从概念上讲,管道是两个进程之间的连接,一个进程的标准输出成为另一个进程的标准输入。在UNIX操作系统中,管道用于进程间通信。管道只是单向通信,即我们可以这样使用管道:一个进程向管道写入数据,另一个进程从管道读取数据。管道,是内存中被视为“虚拟文件”的一块区域。管道可以被创建进程及其所有子进程读写。一个进程可以写入这个“虚拟文件”或管道,另一个相关进程可以从中读取。如果在某个内容写入管道之前,某个进程试图读取该内容,则该进程将挂起,直到内容被翻译 2021-02-17 10:37:47 · 6256 阅读 · 0 评论 -
了解C语言中的exec函数家族
文章目录execvpexecvexeclp和execlexecvpe和execle参考文档(根据参考文档翻译整理而成,针对原文有补充) exec函数家族用新进程替换当前正在运行的进程。它可以通过使用另一个C程序来运行一个C程序,它位于头文件unistd.h下。 exec系列中有许多成员,下面以示例显示。execvp execvp:使用此命令,创建的子进程不必与父进程运行相同的程序。exec类型的系统调用允许进程运行任何程序文件,其中包括二进制可执行文件或shell脚本。语法:int e翻译 2021-02-15 23:06:12 · 5446 阅读 · 0 评论 -
C程序打印环境变量的2种方法
C标准对C中的main函数作了如下说明:程序启动时调用的函数名为main。这个实现没有声明函数原型。它应该必须使用int的返回类型定义,并且不带参数: int main(void) { /* ... */ }或带有两个参数(这里称为argc和argv): int main(int argc, char *argv[]) { /* ... */ }或其他方式。 但是大多数编译器还支持main的第三个声明,该声明接受第三个参数。第三个参数存储所有环境变量。#include &l原创 2021-02-13 17:43:33 · 1280 阅读 · 0 评论 -
了解C语言中的wait()系统调用
对 wait() 的调用会阻止调用进程,直到它的一个子进程退出或收到信号为止。子进程终止后,父进程在wait系统调用指令后继续执行。子进程可能由于以下原因而终止:调用exit();接收到main进程的return值;接收一个信号(来自操作系统或另一个进程),该信号的默认操作是终止。语法:// 获取子进程退出状态并返回死掉的子进程ID pid_t wait(int *stat_loc);原创 2021-02-10 11:42:21 · 10558 阅读 · 0 评论 -
僵尸进程及其预防
文章目录1. 僵尸进程的产生原因1.1 僵尸状态1.2 为什么我们需要避免创建僵尸进程?2. 防止僵尸进程的不同方法2.1 使用 wait() 系统调用2.2 忽略SIGCHLD信号2.3 使用 signal 句柄参考文档1. 僵尸进程的产生原因1.1 僵尸状态 在UNIX中使用 fork() 系统调用创建进程时,将复制父进程的地址空间。如果父进程调用 wait() 系统调用,则父进程的执行将暂停,直到子进程终止。在子进程终止时,会生成“ SIGCHLD”信号,该信号会由内核传递给父进程。父进程翻译 2021-02-08 11:02:31 · 385 阅读 · 0 评论 -
了解C语言中的const
限定符const可以应用于任何变量的声明,以指定其值不会更改翻译 2021-02-05 22:18:13 · 392 阅读 · 0 评论 -
btmp日志提取工具
工作中总是需要查询btmp日志,但使用lastb命令没有办法指定时间段,所以就看了一下lastb命令的源码,结合utmp结构体写了这个小工具。代码点击这里 目前只用到了btmp.h和generate_logfile.c,有这2个文件即可编译运行。server.c和client.c可以用于传输提取好的文件,采用c/s架构,虽然能用,但不方便,我还需要仔细思考,继续完善。工具作用 如果需要提取特定时间段的btmp日志,可以使用该工具。使用方法确认btmp日志的路径,默认为/var原创 2021-02-03 15:59:22 · 1640 阅读 · 0 评论 -
了解C语言中的volatile
我们知道编译器将C代码转换成机器代码,这样就可以在没有实际源代码的情况下运行可执行文件。在将源代码转换为机器代码时,编译器通常会尝试优化输出,以便最终执行较少的机器代码。其中一个优化是删除从编译器视角看来无用的、用于访问变量的机器代码翻译 2021-01-28 15:44:09 · 435 阅读 · 0 评论 -
man 7 inode中文手册及个人理解
每个文件都有一个inode(index node,索引节点),其中包含有关该文件的元数据。应用程序可以使用stat(2)(或相关调用)或statx(2)检索此元数据,stat(2)返回stat结构,statx(2)返回statx结构。以下是通常在文件inode中找到或与之关联的信息,其名称与stat(2)或statx(2)返回的相应结构字段名称一致。Devic原创 2021-01-08 17:19:59 · 1935 阅读 · 0 评论 -
man 3 ctime中文手册
文章目录名称概要描述返回值注意示例参考文档名称asctime, ctime, gmtime, localtime, mktime, asctime_r, ctime_r, gmtime_r, localtime_r - 将日期和时间转换为分解时间(broken-down time)或ASCII码概要#include <time.h>char *asctime(const struct tm *tm);char *asctime_r(const struct tm *tm, char翻译 2020-12-27 19:09:40 · 1288 阅读 · 0 评论