1.常用函数
C语言中有很多常用的函数,下面列举一些常用的函数:
1. printf():输出函数,用于在终端上打印文本和变量的值。
格式化输入输出是指按照一定格式对数据进行输入和输出。在不同的编程语言中,对于格式化输入输出的方法和语法可能会有所差异。常见的格式化输入输出方法如下:
在C语言中,可以使用scanf和printf函数进行输入输出,常用的格式化输入输出符号有:
- %d:读入/输出整数
- %f:读入/输出浮点数
- %c:读入/输出单个字符
- %s:读入/输出字符串
- %p:读入/输出指针地址
- %x:读入/输出十六进制数
- %n:读取到目前为止已经输出的字符个数
2. scanf():输入函数,用于从键盘上获取用户输入的值。
scanf函数是C语言中的输入函数,用于从标准输入设备(一般是键盘)读取数据,并按照指定的格式将数据保存到变量中。其函数原型为:
int scanf(const char *format, ...);
其中,第一个参数format是一个格式字符串,用于指定输入数据的格式;从第二个参数开始,是指向要保存数据的变量的指针。scanf函数会一次读取指定格式的数据,并按照输入格式把数据存储到变量中,直到遇到回车符或者达到指定的输入长度为止。
scanf函数中常用的格式控制符有:
- %d:读入整型数据;
- %f:读入浮点型数据;
- %c:读入字符型数据;
- %s:读入字符串型数据。
例如,以下代码将从键盘输入一个整数和一个浮点数,并将它们分别保存到变量a和b中:
int a;
float b;
printf("请输入一个整数和一个浮点数:\n");
scanf("%d%f", &a, &b);
printf("你输入的整数是
3. strlen():字符串长度函数,用于计算字符串的长度。
strlen函数是C语言中的字符串函数,用于计算一个字符串的长度,即字符串中字符的个数(不包括字符串结束符'\0')。其函数原型为:
size_t strlen(const char *str);
其中str是一个指向字符串的指针,函数返回值是一个size_t类型的整数,表示字符串的长度。
例如,以下代码将输出字符串"Hello World"的长度:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello World";
printf("字符串的长度为:%zu\n", strlen(str));
return 0;
}
输出结果为:
字符串的长度为:11
需要注意的是,strlen函数只能用于计算以'\0'结尾的字符串的长度,如果传入的参数不是字符串类型,可能会导致运行错误。同时,如果字符串为空指针或者只包含'\0'字符,strlen函数返回0。
4. strcat():字符串连接函数,用于将两个字符串连接起来。
strcat函数是C语言中的字符串函数,全称为“string concatenate”,用于将一个字符串追加到另一个字符串的末尾。它的函数声明如下:
char* strcat(char* dest, const char* src);
其中,dest是目标字符串,src是源字符串。函数返回值是目标字符串的首地址。
strcat函数的功能是将源字符串src的内容追加到目标字符串dest的末尾,并将字符串末尾的'\0'保留在目标字符串dest的末尾,因此目标字符串dest必须具有足够的空间以容纳源字符串src的内容。
例如,下面的代码使用strcat函数将字符串s2追加到字符串s1的末尾:
char s1[20] = "hello";
char s2[] = " world!";
strcat(s1, s2);
printf("%s", s1);
程序输出结果为:
hello world!
需要注意的是,如果源字符串src和目标字符串dest有重叠部分,那么strcat函数的行为就是未定义的,因为会导致数据出错。所以在使用strcat函数时,一定要确保源字符串和目标字符串不会重叠。
5. strcpy():字符串复制函数,用于将一个字符串复制到另一个字符串中。
strcpy是一个字符串函数,用于将一个字符串复制到另一个字符串中。它的原型如下:
char *strcpy(char *dest, const char *src);
其中,dest是目标字符串的地址,src是源字符串的地址。该函数会将源字符串复制到目标字符串中,并返回指向目标字符串的地址。
例如,以下示例将“Hello World”字符串复制到dest数组中:
char src[] = "Hello World";
char dest[20];
strcpy(dest, src);
printf("复制后的字符串为:%s\n", dest);
输出结果为:复制后的字符串为:Hello World。
需要注意:
-
如果目标字符串没有足够的空间来存储源字符串,将会导致缓冲区溢出的错误。
-
源字符串必须以空字符'\0'结尾。
-
如果目标字符串和源字符串重叠,会导致意想不到的结果。
-
如果源字符串为空,将导致不可预测的结果。
6. strcmp():字符串比较函数,用于比较两个字符串是否相等。
strcmp函数是一个C标准库函数,用于比较两个字符串。它的语法如下:
int strcmp(const char *s1, const char *s2)
该函数比较两个字符串s1和s2,如果它们相等,则返回0;如果s1大于s2,则返回正值;如果s1小于s2,则返回负值。
如果要比较不区分大小写的字符串,则可以使用strcasecmp函数。其语法与strcmp类似,只是不区分大小写。
int strcasecmp(const char *s1, const char *s2)
需要注意的是,strcmp函数和其它字符串函数一样,要求其参数为null结尾的字符串。
7. calloc():动态内存分配函数,用于在程序运行时动态分配内存空间。
calloc函数是C语言标准库中的一个函数,它用于在内存中分配指定数量的连续字节,并将这些字节的值设置为0。calloc函数的声明如下:
void *calloc(size_t num, size_t size);
其中,num表示需要分配的元素个数,size表示每个元素的大小,函数返回一个指向分配内存的指针。calloc函数与malloc函数类似,不同之处在于calloc会将内存清零,即初始化为0,而malloc不会。另外,calloc函数也会检查内存分配是否成功,如果失败会返回NULL指针。calloc函数在动态分配内存时非常实用,可以避免访问未初始化的内存导致的错误。
8. free():内存释放函数,用于释放动态分配的内存空间。
在C语言和C++语言中,free()函数用于释放之前使用malloc()或calloc()函数分配的内存空间。当动态分配的内存不再需要使用时,应该使用free()函数释放该空间,以便将其返回给堆。使用free()函数释放内存后,该内存空间将变得不可用,直到下一次使用malloc()、calloc()或realloc()函数重新分配了该空间。下面是free()函数的函数原型:
void free(void *ptr);
其中,参数ptr表示需要释放的内存块的首地址。
9. fopen():文件打开函数,用于打开一个文件。
fopen()是C语言中的一个标准库函数,用于打开文件并建立与该文件的连接,使得程序能够对文件进行读写操作。它的函数原型如下:
FILE *fopen(const char *filename, const char *mode);
其中,filename是要打开的文件名字符串,mode是打开文件的模式,它可以是以下一种或多种:
- "r":打开一个已有文件,只允许读取
- "w":打开一个文件,允许写操作,若文件不存在则创建
- "a":打开一个文件进行追加操作,若文件不存在则创建
- "r+":打开一个已有文件进行读写操作
- "w+":打开一个文件进行读写操作,若文件不存在则创建
- "a+":打开一个文件进行读写操作,若文件不存在则创建,读取从文件开始处,写入从文件末尾处
fopen()函数返回一个指向FILE结构体类型的指针,该指针可以被传递给其他的文件操作函数,如fread()、fwrite()、fseek()等等进行文件操作。当文件打开失败时,该函数将返回一个空指针NULL。
10. fclose():文件关闭函数,用于关闭一个文件。
fclose()是C语言中的一个标准库函数,用于关闭之前通过fopen()函数打开的文件连接。它的函数原型如下:
int fclose(FILE *stream);
其中,stream是之前通过fopen()函数打开的文件指针。当文件成功关闭时,返回0;否则,返回EOF。
关闭文件前,程序应该确保已经完成了所有对该文件的操作,并且写入缓存区的数据已经被成功写入磁盘。如果在关闭文件前程序没有完成所有的写操作,那么这些写操作所产生的数据将会丢失。因此,在关闭文件前,程序应该调用fflush()函数将缓冲区中的数据刷新到磁盘中,以防止数据丢失。
fflush(stream);
fclose(stream);
11. fgets():文件读取函数,用于从文件中读取一行数据。
fget函数是C语言中的标准库函数之一,用于从文件中读取一行数据。其函数原型如下:
char *fgets(char *s, int size, FILE *stream);
其中,参数s指向了一块字符数组,用于存储读取到的数据。参数size指定了字符数组的大小,一般而言应该大于等于文件中一行数据的长度。参数stream是文件指针,指定了要从哪个文件中读取数据。
fgets函数读取数据的规则是:从指定文件中读取一行数据(包括行末的换行符),然后将数据存储到指定的字符数组中。如果读取到了文件末尾或者出现了错误,fgets函数返回NULL;否则,返回指向字符数组的指针。
需要注意的是,fgets函数将保留行末的换行符,并将其作为字符串的一部分存储到字符数组中。如果不需要换行符,可以使用字符串处理函数(如strtok)将其删除。
12. fputs():文件写入函数,用于向文件中写入一行数据。
fputs函数是C语言中的标准库函数之一,用于向文件中写入字符串。其函数原型如下:
int fputs(const char *s, FILE *stream);
其中,参数s是要写入的字符串,而参数stream是文件指针,指定了要向哪个文件中写入数据。
fputs函数的使用方法非常简单,只需要将要写入的字符串和文件指针作为参数调用函数即可。如果写入成功,函数返回一个非负数;否则,返回EOF。
需要注意的是,fputs函数不会自动添加换行符,如果需要换行符,需要手动在字符串中添加。同时,fputs函数也不会自动添加文件末尾的空字符('\0'),因此在写入字符串之前需要确保字符数组中有足够的空间存储字符串。
13.getchar函数和putchar函数都是用于输入输出字符的标准库函数。
getchar函数用于从标准输入流(通常是键盘)读取一个字符,并返回其ASCII码值。语法如下:
int getchar(void);
14.putchar函数用于将一个字符输出到标准输出流(通常是屏幕)。语法如下:
int putchar(int c);
其中,c是要输出的字符的ASCII码值。putchar函数返回成功输出的字符数。
例如,以下代码读取用户输入的字符并输出它:
#include <stdio.h>
int main() {
char c;
printf("Please enter a character: ");
c = getchar();
printf("The character you entered is: ");
putchar(c);
return 0;
}
当用户输入字符后,程序将读取该字符并将其输出。
2.码值
C语言的码制包括ASCII码和UNICODE码。
ASCII码是美国信息交换标准代码,是用于表示文字字符的标准编码系统。其编码范围为0x00-0x7F,共计128个字符。
UNICODE码是一种国际化字符集,是用于表示全球所有语言的字符的编码系统。其编码范围非常广泛,包括了几乎所有世界上的文字字符,共计超过130,000个字符。在C语言中,可以使用wchar_t类型来存储UNICODE码字符。
C语言中的字符常量使用单引号(')包围,例如:'A'、'b'、'1'等等。为了表示特殊字符,C语言提供了一些转义字符,例如:'\n'表示换行符,'\t'表示制表符等等。
3.原码、反码、补码
原码、反码、补码是计算机中常用的三种表示有符号整数的方法。
-
原码:原码是直接将一个数值转换成二进制表示,最高位表示符号位,0表示正数,1表示负数。例如,+5的原码为00000101,-5的原码为10000101。
-
反码:反码是将原码符号位不变,其余各位取反得到的,正数的反码和原码相同,负数的反码则是其原码除符号位外各位取反。例如,+5的反码为00000101,-5的反码为11111010。
-
补码:补码是将原码符号位不变,其余各位取反后加一得到的。正数的补码和原码相同,负数的补码是其反码加1。例如,+5的补码为00000101,-5的补码为11111011。
补码的使用可以简化电路实现,同时解决了原码和反码运算中零的表示不唯一的问题。在计算机中,常用补码表示有符号整数,并且对于负数的减法运算,可以通过将减数取补码,然后与被减数相加,再将相加结果取补码,得到正确的结果。
4.sizeof函数
C语言中的sizeof函数用于计算数据类型或变量所占用的字节数。它的语法为:
sizeof(数据类型/变量)
例如,如果要获取整型数据类型int占用的字节数,可以这样使用:
int size = sizeof(int);
需要注意的是,sizeof函数返回的是一个size_t
类型的值,通常是一个无符号整数。在使用时,可以使用格式符%zu
输出该值。
sizeof函数的另一种用法是计算数组的总大小。例如,对于一个长度为5的整型数组,可以这样使用:
int arr[5];
int size = sizeof(arr);
这里的size将会等于20(假设int占用4个字节)。
需要注意的是,在函数参数中使用数组名时,编译器会自动将其转换为指向数组首元素的指针,因此sizeof(arr)返回的是整个数组的大小,而不是指针所占的大小。