一、输入输出函数及其作用:
注意: 在使用输入输出函数时要在源文件的开头使用:#include<stdio.h>或者#include " stdio.h " 把stdio.h头文件包含到源程序文件中。(关于什么是头文件,什么是源程序在第二幕中已讲)
1. printf () 函数:
函数作用:用于输出内容到控制台(控制台是什么,在下面有简单介绍)。以下是' printf '函数的使用示例:
#include<stdio.h>
int main(){
printf("记得点赞收藏加关注!!\n");
return 0;
}
这段程序运行后输出的内容就是:记得点赞收藏加关注!!(这个函数输出的就是双引号“”内的内容,而\n是转义字符作用是换行,这里大家先对这个转义字符有个印象,之后作者会专门写一篇文章讲转义字符的作用):
以上的例子是一个简单的示例,下面给出一个稍微复杂一点的例子:
#include <stdio.h>
int main() {
int num = 10;
printf("数字是: %d\n", num);
return 0;
}
以上代码中的%d(打印十进制整数是使用%d)是格式化字符串中的占位符,在上面的代码中表示将变量' num '的值插入到%d的位置(具体说明会在下一次的主线中讲到,目前大家先知道有着这样一个东西)输出内容:
注意:' printf '函数的格式就如上两张图所示,你想将什么东西插入到占位符的位置,就得在双引号外加逗号后写你想插入的变量。(上面代码中是想将num的值插入到%d的位置)
控制台:
通俗一点来说:控制台就像是计算机的“通信中心”,它包括屏幕和键盘。屏幕用来显示信息,键盘用来输入文字或命令。在编写C语言程序时,你可以通过控制台与你的程序交流。比如,通过键盘输入数据,然后程序处理这些数据并在屏幕上显示结果。控制台不仅是你和程序之间的对话窗口,也是检查程序问题的地方,就像一个调查员会去检查和了解事情发生的情况一样。
2. scanf () 函数:
函数作用:用于从控制台接收输入
以下是使用' scanf '函数的代码示例:
#include <stdio.h>
int main() {
int num;
printf("请输入一个数字: ");
scanf("%d", &num);
printf("您输入的数字是: %d\n", num);
return 0;
}
在上面' printf '的例子中我们直接将 '1 '给' num '不能在键盘上使用自己想使用的值,而' scanf '函数就解决了这个问题,在上述的的代码中只定义了一个整型变量' num '但是并没有给他赋值,在之后就用了' scanf '函数给' num '赋值,' scanf '函数的格式如上图所示,因为给' num '定义的是整型,所以' scanf '中的占位符使用的是%d并用双引号“ ”将%d包含在里面,然后在双引号外先使用逗号,再使用' & '取地址符号最后写你想将键盘输入的值赋给的这个变量,上述代码运行结果如图所示:
注意:因为我们给' num '定义的是整型变量,因此我们在使用' scanf '函数用键盘给' num '赋值时必须输入数字,如果你想输入字符或者是字符串(字符是指单个的字母、数字、标点符号或特殊字符而字符串是由一系列字符组成的)那么就得定义字符型变量,并且得使用%c(单个字符)或者%s(字符串)各种的数据类型我们将在下一篇文章中讲到。
scanf 函数的优点和缺点:
优点:
1、灵活性:`scanf` 函数能够使用各种格式化符号来读取特定格式的输入,不仅仅是字符串。
2、格式化输入:可以根据需要读取不同类型的数据,例如整数、浮点数等。
缺点:
1、空格处理:`scanf` 在读取字符串时遇到空格会停止读取,因此不能一次性读取含有空格的整行文本。
2、缓冲区溢出:和 `gets` 类似,`scanf` 也可能导致缓冲区溢出,特别是在输入时没有限制字符串长度时。(什么是缓冲区本篇文章之后也有详细说明)
3. gets () 函数
函数作用:用于从标准输入获取字符串,但不安全,不推荐使用,在最新的C11标准中' gets '函数已经被弃用,因此在' gets '函数已经在一些编译器中不能使用。(' gets '函数不安全的原因写在了下面)以下是使用' gets '函数的代码示例:
#include <stdio.h>
int main() {
char name[50];
printf("请输入您的名字: ");
gets(name);
printf("您的名字是: %s\n", name);
return 0;
}
' gets '函数与' scanf '函数同为输入函数,那么他们之间有什么不一样的地方呢?或者说它们有什么各自的优缺点,以下是' gets '函数和' scanf '函数的优缺点:
gets 函数的优点和缺点:
优点:
1、简单易用:`gets` 函数使用简单,只需提供一个指向字符数组的指针即可。
2、能够读取一整行:它会读取整行输入(直到换行符 `\n` 或文件结尾),包括空格在内的所有字符,且会将换行符替换为 null 终止符。
缺点:
1、不安全:`gets` 没有限制输入字符串的长度,容易导致缓冲区溢出,存在安全漏洞。
2、不建议使用:由于安全问题,C11标准中已经弃用了 `gets` 函数。
'gets()'函数不安全的原因:
原因在于它没有办法限制用户输入的长度。通俗地说,`gets()` 函数会读取用户输入的字符串,但它不会检查这个字符串的大小,所以用户可以输入比程序分配的空间更大的字符串,这可能导致程序发生内存溢出。
比如,如果程序分配了一个长度为 50 的字符串,但用户输入了一个长度为 100 的字符串,`gets()` 函数会不假思索地将这 100 个字符都读取进来,这会超出程序为字符串分配的空间,覆盖了其他内存区域,导致程序崩溃或者安全漏洞。
4. puts() 函数
函数作用: 用于向控制台输出字符串。与' printf '输出函数类似,但是' puts '函数只能输出字符串,而printf可以输出各种数据类型和字符串,简单来说printf要比puts函数厉害很多。下面是puts函数的代码示例:
#include <stdio.h>
int main() {
char greeting[] = "Hello, World!";
puts(greeting);
return 0;
}
就比如我写出了以下的代码,编译器就会报错:
总而言之,`puts` 适用于简单的字符串输出且自动添加换行符,而 `printf` 更灵活,可以进行复杂的格式化输出和处理不同类型的数据。
5. fgets() 函数
函数作用:从标准输入获取一行字符串,更安全。' fgets '函数就像' gets '函数的升级版,可以指定读取的最大字符数,避免缓冲区溢出,当然既然是' gets '函数的升级版,所以' fgets '函数也有着' gets '函数的特性,' fgets '函数也是主要用来输入字符串的,' scanf '也比' fgets '函数灵活。
#include <stdio.h>
int main() {
char sentence[100];
printf("请输入一句话: ");
fgets(sentence, 100, stdin);
printf("您输入的是: %s\n", sentence);
return 0;
}
如上图所示' fgets '的基本语法就是' fgets(变量,长度,stdin)',这里的变量就是sentence,长度就是指定读取的最大的字符数,因为在定义中给sentence这个字符串定义的长度是100,所以在使用' fgets '函数是中间的长度就是100,(当然我的说法不太严谨,这样的说法只是帮助你们理解这个函数,在这篇文章等会儿我们还会讲到计算内存占用的函数:' sizeof() ',这个函数通常会与' fgets '函数一起使用,本文的最后还会讲一讲' sizeof '函数)至于stdin是指的标准输入,' fgets '函数通常都是与stdin一起使用。(下面也会讲一讲stdin是什么)
下面是' fgets '函数的运行示例:
可能会有小伙伴们会好奇如果我们输入的数据超出了我们定义的长度会怎么样,那么就让我们来试试吧:
我将句子的长度改成了10,运行的时候我输入了25个字符,程序输出时可以发现句子不经发生了截断还出现了一个问号,所以大家在定义数据是尽量将字符串长度定大一点,避免输入数据时超出我们定义的字符串长度。
stdin简单介绍:
当你使用 `fgets()` 函数时,`stdin` 实际上就是表示你的程序从哪里获取输入的地方。通俗地说,`stdin` 就像是你程序的“耳朵”,它让你的程序听得到用户输入的内容。在大多数情况下,`stdin` 意味着键盘输入,也就是用户可以通过键盘输入数据。
当你调用 `fgets()` 函数时,你要告诉程序,要从哪里读取输入。而这个地方就是 `stdin`。所以,`fgets()` 会从键盘读取用户输入的内容,并将它保存在你指定的地方,比如一个字符串变量中。
`stdin` 是一个让你的程序和用户进行交流的地方,就像是程序的接收器,能够获取来自用户的信息,让你的程序能够根据用户输入来进行相应的操作。
二、数学函数及其作用
注意: 在使用输入输出函数时要在源文件的开头使用:#include<math.h>或者#include " math.h " 把math.h头文件包含到源程序文件中。
1、sqrt() 函数
函数作用:计算一个数的平方根。
注意:在C语言中,`sqrt()`函数的参数应该是浮点数类型(`float`或`double`),因为该函数用于计算一个数的平方根,而整数的平方根可能是一个浮点数。如果将整数作为参数传递给`sqrt()`函数,C语言会进行隐式类型转换,将整数转换为浮点数,然后计算其平方根。下面是'sqrt()'函数的代码示例:(之后的文章中我将会对类型转换写一篇文章,在下面的代码中我定义了double类型的变量,但是在' printf '函数中我却使用了%f用作占位符而不是%lf大家想一想这是为什么??待会儿将会给出解释)
#include <stdio.h>
#include <math.h>
int main() {
double num = 25.0;
double result = sqrt(num);
printf("%f开平方之后的结果是%f\n", num, result);
return 0;
}
下面我们来家解释一下这个代码,在第一第二行分别包含了头文件‘stdio.h’和‘math.h’因为我们会使用到 ‘'printf()'函数和 'sqrt()'函数,第四行定义了一个双精度浮点数变量num并将其赋值为25.0,第五行又定义了一个双精度浮点数变量result并将num开平方之后的结果赋值给了result ( 'sqrt()'函数使用的方法就是将你想开平方的数写在‘sqrt(你想开平方的数)’然后这个函数整体就代表了开平方后的结果,上面的代码就是将这个整体也就是num开平方后的值赋值给了result ) 下面我们来看一看上面这个程序运行的结果:
你如果不想要后面这些没什么用处的 0 你可以将‘printf()’函数中的占位符改成%g(之后的代码也有使用%g的情况),下面是改后代码的示例:
(有关各种占位符的作用我将会另写一篇文章专门讲一讲)
使用' %f '用作占位符解释:
1.在C语言中,`printf()` 函数中的 `%f` 是用来格式化输出浮点数的占位符,无论浮点数的类型是 `float` 还是 `double`。所以无论你使用 `float` 还是 `double` 类型的变量,都可以使用 `%f` 来作为输出其值的占位符。
2.在C语言中,`%f` 用来表示浮点数,而不是针对特定的浮点数类型。所以,对于 `printf()` 函数来说,`%f` 可以用来输出 `float` 或 `double` 类型的浮点数值,因为它们都是浮点数类型。
3.因此,即使你在代码中使用了 `double` 类型的变量,也可以用 `%f` 作为输出其值的占位符。 `%f` 用来表示浮点数值,无论是 `float` 还是 `double` 类型,都可以适用。
2、pow()函数
函数作用:计算一个数的幂
使用方法:假如你想计算2的3次方,你就可以写成pow(2,3)在‘pow()’函数的使用中要将底数放在前面,幂放在后面并将底数和幂用逗号隔开。(注意:‘pow()’函数的参数可以是整数、浮点数或者双精度浮点数,如果你在‘pow()’函数中传递了整数参数,他们会被隐式地转换成浮点数。通常情况下,将参数定义为双精度浮点数是为了确保更高的精度和范围)下面是pow()函数的使用格式:
#include <math.h>
double pow(double x, double y);
下面来看一下代码示例(为了符合其格式,我将数定义成双精度浮点数,exponent是幂的意思,只是作为一个变量的名称):
#include <stdio.h>
#include <math.h>
int main() {
double base = 2.0;
double exponent = 3.0;
double result = pow(base, exponent);
printf("%f 的 %f 次方结果是 %f\n", base, exponent, result);
return 0;
}
代码运行示例:
3、fabs()函数
函数作用:返回一个数的绝对值
使用方法:这个函数就是计算绝对值的函数,假如你想计算-10.5的绝对值,你就可以写成fabs(-10.5)然后这个函数就会返回10.5(意思就是这个函数计算的结果就是10.5,另外‘fabs()’函数的参数也可以是整数、浮点数或者双精度浮点数,如果你在‘fabs()’函数中传递了整数参数,他们会被隐式地转换成浮点数,这一点与‘pow()’函数一样)下面是‘fabs()’函数的使用格式:
#include <math.h>
double fabs(double x);
下面来看一下代码示例:
#include <stdio.h>
#include <math.h>
int main() {
double num = -10.5;
double absolute = fabs(num);
printf(" %f 的绝对值是 %f\n", num, absolute);
return 0;
}
代码运行示例:
4、sin()、cos()、tan()函数
函数作用:计算给定角度的正弦、余弦和正切值。
注意:C语言的数学库中,‘sin()’、‘cos()’、‘tan()’函数里的角度单位是弧度,而不是度数,这意味着当你调用这些函数时,参数应该是以弧度为单位的角度值。如果你想计算某个度数的正弦、余弦或正切值,需要将度数转换为弧度才能使用。(角度变弧度公式:弧度=(角度x π)/180 反之:角度=(弧度 x 180)/π)
使用方法:假如你想计算30度的正弦、余弦和正切值,第一步你得先将角度转换成弧度,将45度转换成弧度约为 0.5235987756弧度,在使用时只需将这个数字放在‘sin(这里)’,不过因为将角度转换成弧度值的数字一般特别长,并且不是精确值,比如这个30度的弧度制,在程序中我们可以不计算度数的弧度值,我们可以只写出公式然后让计算机帮我们计算。下面是‘sin()’、‘cos()’和‘tan()’函数的格式:
#include <math.h>
double sin(double x);
double cos(double x);
double tan(double x);
代码示例,以计算30度正弦值(计算余弦和正切的方法一致)为例:
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
int main() {
double angle_degree = 30.0;
double angle_radian = angle_degree * (PI / 180.0);
double sin_val = sin(angle_radian);
printf("sin(%f degrees) = %f\n", angle_degree, sin_val);
return 0;
}
上面代码中的第六行就是使用了公式将45度的弧度制计算出并赋值给angle_radian变量,代码运行示例:
三、字符函数
注意:在使用输入字符函数要在源文件的开头使用:#include<ctype.h>或者#include " ctype.h " 把ctype.h头文件包含到源程序文件中。
1、isalpha()函数
函数作用:检查一个字符是否为字母
使用方法:这个函数在使用值只需将你想检查的字符放在‘isalpha(这里)’假如是字母的话函数就会返回1,不是的话函数会返回0。而在C语言中非0为真,0为假(注意:非0视为真,负数在C语言中也会被视为真)下面是函数的使用格式:
#include <ctype.h>
int isalpha(int ch);
下面是检查‘A’是否为字母的代码示例:
#include <stdio.h>
#include <ctype.h>
int main() {
char ch = 'A';
if (isalpha(ch)) {
printf("%c 是字母\n", ch);
} else {
printf("%c 不是字母\n", ch);
}
return 0;
}
下面是代码运行示例:
‘if’是C语言中的一个关键字,作者在之后会再关键字的文章中写到,‘if’关键字中的语句的执行条件是‘if()’括号中的条件为真,在上面的代码中‘if’关键字的判断条件是“isalpha(ch)”显然‘A’是字母,于是“isalpha(ch)”返回1,为真,于是运行‘if’关键字中的语句。
2、isdigit()函数
函数作用:检查一个字符是否为数字
使用方法:使用方法与‘isalpha()’函数类似,下面是‘isdigit()’函数的使用格式:
#include <ctype.h>
int isdigit(int ch);
下面是代码示例,以数字‘7’为例:
#include <stdio.h>
#include <ctype.h>
int main() {
char ch = '7';
if (isdigit(ch)) {
printf("%c 是数字\n", ch);
} else {
printf("%c 不是数字\n", ch);
}
return 0;
}
代码运行结果:
四、字符串函数
注意:在使用输入字符函数要在源文件的开头使用:#include<string.h>或者#include " string.h"把string.h头文件包含到源程序文件中。
1、strlen()函数
函数作用:计算字符串长度(不包括末尾的空字符‘/0’)
使用方法:我们可以直接在‘strlen(这里)’括号中写你想计算字符的长度()函数的使用格式:
#include <string.h>
size_t strlen(const char *str);
上述代码中的‘ * ’是属于指针的知识,这里大家先有一个印象,在主线文章之中我们会讲到,在使用时并不复杂,下面是代码示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
size_t length = strlen(str);
printf("字符串的长度是: %zu\n", length);
return 0;
}
在上述代码第四行定义了一个字符串数组,名字是‘ str ’,第五行中我们定义了一种新的类型‘ size_t ’这个类型大家最好记住哦,定义这个类型的原因是‘strlen()’函数返回的是一个无符号整数类型(就是指的‘size_t’),因此在第六行的‘printf()’函数中使用了一个全新的占位符‘ %zu ’大家记住‘ %zu ’是用于打印‘size_t’类型的值的占位符。下面是代码运行的情况:
大家有没有对这个代码的运行结果产生疑问呢??明明加上逗号和感叹号才12个字符,为什么输出结果是13呢?这是因为‘strlen()’函数计算的是字符串中非空字符的数量,直到遇到字符串末尾的空字符(‘ \0 ’)为止,因此,空格、标点符号和其他字符都会被计算在字符串长度之内。
2、strcpy()函数
函数作用:将一个字符串复制到另一个字符串
使用方法:假如有一个字符串‘ str1 ’和另一个字符串‘ str2 ’,‘str1 ’的内容是“Hello”,而‘ str2 ’中没有任何内容,现在我们需要将‘ str1 ’中的内容复制到‘ str2 ’中,我们就可以这样写:‘ strcpy(str1 , str2) ’,这样我们就可以将‘ str1 ’的内容复制到‘ str2 ’中。函数的使用格式如下:
#include <string.h>
char *strcpy(char *dest, const char *src);
代码示例:
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello";
char dest[20];
strcpy(dest, src);
printf("复制后的字符串是: %s\n", dest);
return 0;
}
在上述代码中的第四行我们定义了一个字符串数组‘str’并将“Hello”存在里面,第五行我们定义了另一个字符串数组‘dest’并将其长度定义为20(注意我们在定义复制给值的数组(这里指‘dest’数组)时,要尽量将数组的长度定义的大一点,不能短于被复制的字符串的长度,不然编译器会报错)代码运行示例:
3、strcat()函数
函数作用:将一个字符串连接到另一个字符串的末尾
使用方法:与‘strcpy()’的使用类似,假如有一个字符串数组‘dest’和另一个字符串数组‘src()’,‘dest’数组中的内容是“Hello, ”‘src’数组中的内容是“World!”我们要将这两个数组连接起来我们可以这样写‘strcat(dest, src)’。‘strcat()’函数的使用格式:
#include <string.h>
char *strcat(char *dest, const char *src);
代码示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
char src[] = "World!";
strcat(dest, src);
printf("连接好后的字符串的内容是: %s\n", dest);
return 0;
}
在第四行代码我们定义了一个字符串数组‘dest’并将其长度定义为20(这是因为,连接好后的函数会被放在前一个数组中(这里指的是‘dest’),因此我们要将用作头连接的函数的长度尽量给长)代码运行情况:
五、总结
在本篇文章中我们主要讲了C语言中常用的函数:
有包含在‘ stdio.h ’头文件中的:‘printf()’函数、‘scanf()’函数、‘gets()’函数、‘puts()’函数、‘fgets()’函数
有包含在‘math.h’头文件中的:‘sqrt()’函数、‘pow()’函数、‘fabs()’函数、‘sin()函数’、‘cos()’函数、‘tan()’函数
有包含在‘ctype.h’头文件中的:‘isalpha()’函数、‘isdigit()’函数
有包含在‘string.h’头文件中的:‘strlen()’函数、‘strcpy()’函数、‘strcat()’函数
在本篇文章中所写到的函数还请大家一定要重视起来,能记下来最好不过了(最好的办法就是将本篇文章收藏起来!!!o(* ̄︶ ̄*)o)
下篇预告:第二幕:C语言基础篇之基本数据类型(基本整型、短整型、长整型、双长整型、字符型、单精度浮点型、双精度浮点型、复数浮点型、无符号类型、布尔型、格式符(占位符))
题外话:
最近的事情越来越多了,ε=(´ο`*)))唉,我会尽量更章的,喜欢文章的小伙伴们、觉得看了文章之后长知识的小伙伴们记得点赞,收藏加关注!!!(*^▽^*)