详解C/C++输入输出

2024-09-23 17:30:19 浏览数 (1)

前言

C/C 输入输出很多,在不同的情况会用不同的输入输出,有的题目在输入时可能换一种输入输出就能不会TLE,有的输入可能要循环输入,但是可以换一种输入直接就能把所有数据输入进去。C/C 有哪些常用的输入输出,在什么时候用它们,这篇博客我会一一详解。

输入

一、cin

cin是C 的输入,是C 里面最常用的一种输入。既可以输入数字,也可以输入字符、字符串。注意,cin输入字符串时,当遇到空格、回车、Tab都会结束。当需要输入空格时,那要用什么,后面会讲解。当输入空格字符时,cin不会把空格读入进去。

代码语言:javascript复制
#include<iostream>
#include<cstring>
using namespace std;
int n;
string s;
char a,b,c;
int main(){
	cin>>n;
	cin>>s;
	cin>>a>>b>>c;
	cout<<"数字为:"<<n<<endl;
	cout<<"字符串为"<<s<<endl;
	cout<<"字符为"<<a<<" "<<b<<" "<<c<<endl;
	return 0;
}
二、scanf

用于从标准输入读取格式化的输入,例如整数、浮点数、字符串等,sacnf是C语言的输入,但是广泛应用于C 程序里面,这是因为C语言的scanf比C 的cin快3~4倍,这是因为scanf是用指针操作的,没有类型的安全机制,比如char类型scanf可以用%f输入,而不会报错,但是运行时会出现异常。cin是自动判断你的变量类型,比如char类型,他会用默认的char方法(%c)取数据。这就会影响的效率。

scanf遇到空格、Tab、回车都会结束输入。

当我们看别人程序时前面会出现一行代码,可以用这两行代码实现scanf与cin同步,时间几乎是一样的。

代码语言:javascript复制
ios::sync_with_stdio(false);
cin.tie(0);

scanf在输入时,就比较个体化了,不同的类型都有不同的输入表示。

代码语言:javascript复制
#include<iostream>
#include<cstring>
using namespace std;
int n1;
float n2;
double n3;
char ch[100],a,b;
int main(){
	scanf("=%f%lf",&n1,&n2,&n3);//=接受三位数字 
	scanf("%s",ch);//不接受空格、Tab、回车 
	scanf("%c%c",&a,&b);
	printf("数字为:%d %.3f %.2fn",n1,n2,n3);//%f自动转成%lf 
	printf("字符数组为:%sn",ch);//ch.c_str()
	printf("字符为:%c %cn",a,b);//%c可以吃空格 
	return 0;
} 

注:在C语言中,scanf函数可以用于字符数组,但是在C 中,scanf函数不能直接用于string类。因为string是C 中的一个类,而scanf函数是C语言的函数,并不支持C 的类类型。

三、gets

gets() 函数的功能是从输入缓冲区中读取一行字符串存储到字符指针变量 str 所指向的内存空间。可以接受空格、Tab,但是不接受回车

代码语言:javascript复制
#include<iostream>
#include<cstring>
using namespace std;
int n1;
float n2;
double n3;
char ch[100],a,b;
int main(){
	gets(ch); 
	printf("%s",ch);
	return 0;
} 
四、getchar

getchar()用于从标准输入流获取一个字符。getchar()函数每次从输入流中读取一个字符,并返回该字符的ASCII码值(整数类型)。读取的字符可以是任意可打印字符、控制字符或特殊字符。常用于吃掉回车。

使用getchar()函数时,程序会等待用户从键盘输入一个字符,然后按下回车键确认。之后,函数会将输入的字符返回给程序,并继续执行后续的代码。

代码语言:javascript复制
#include <stdio.h>

int main() {
   int c;
 
   printf("请输入一个字符:");
   c = getchar();
 
   printf("n你输入的字符是:");
   putchar(c);
 
   return 0;
}

五、fgets

fgets用于从文件流中读取一行字符串。它的原型如下:

代码语言:javascript复制
char *fgets(char *str, int n, FILE *stream);

参数说明: - str:用于存储读取字符串的缓冲区的地址。 - n:读取字符的最大数量(包括终止符''),通常为缓冲区的长度。 - stream:文件流指针,指定从哪个文件流读取字符串。

fgets函数会从文件流中读取一行字符,直到遇到换行符'n'、文件结束符EOF或者读取字符达到了最大数量n-1为止。读取到的字符会存储在str所指向的缓冲区中,并在末尾添加一个终止符''。如果成功读取到字符,则返回str的地址,否则返回NULL。

代码语言:javascript复制
#include<stdio.h>

char ch1[10];
char ch2[10];
int main()
{
	fgets(ch1,5,stdin);
	fgets(ch2,5,stdin);
	printf("ch1=%sn",ch1);
	printf("ch2=%s",ch2);
	return 0;
}

gets是无限读取,fgets有了指定的大小。fgets函数相对于gets函数更加安全,因为它可以指定读取字符的最大数量,避免了缓冲区溢出的风险。同时,fgets函数也可以用于读取文件中的文本行。

六、cin.get

cin.get函数是C 标准库中的一个函数,用于从输入流中读取字符。它的基本语法如下:

代码语言:javascript复制
cin.get(character);

其中,character为一个字符变量,用于存储从输入流中读取的字符。cin.get函数会读取输入流中的下一个字符,无论该字符是空格、制表符还是换行符。读取成功后,该字符会被存储到character变量中。它可以接受空格,不接受回车,回车结束输入。

cin.get函数可以和其他输入函数(如cin或getline)配合使用,以实现更复杂的输入操作。例如,可以使用cin.get函数读取一个完整的字符串,然后使用其他函数处理该字符串。

示例代码如下:

代码语言:javascript复制
#include <iostream>
using namespace std;

int main() {
   char character;

   cout << "请输入一个字符: ";
   cin.get(character);

   cout << "您输入的字符是: " << character << endl;

   return 0;
}

在上述示例中,程序会提示用户输入一个字符,并使用cin.get函数从输入流中读取该字符。然后,程序会将读取到的字符输出到屏幕上。

七、cin.getline

cin.getline用法是从输入流中读取一行字符串,并将其存储到一个字符数组中。它的语法是:

代码语言:javascript复制
cin.getline(字符数组名, 最大长度, 终止字符)

其中,字符数组名是存储字符串的字符数组的名称,最大长度是字符数组的长度,终止字符是可选参数,用于指定在哪个字符之前终止读取,默认情况下是'n'。如果读取的字符串的长度超过了最大长度,超出部分的字符将被丢弃。

示例用法:

代码语言:javascript复制
char name[20];
cin.getline(name, 20);

cout << "Hello, " << name << "!" << endl;

在这个例子中,程序将从输入流中读取一个最大长度为19的字符串,并将其存储到名为name的字符数组中。然后,程序会输出一个问候语,其中包括这个读取到的字符串。

需要注意的是,cin.getline函数读取字符数组时会忽略开头的空白字符,并在读取结束后自动添加一个空字符('')作为字符串的结束标志。因此,在使用cin.getline函数读取字符串后,可以直接将字符数组作为字符串处理。

注:gets() , cin.getline()和cin.get()不能用在string类型中,五六七都不太常用。

输出

一、cout

cout 是 C 标准库中的输出流对象,用于将数据输出到标准输出设备,默认情况下是输出到屏幕上。可以输出数字、字符、字符串等。

在用于四舍五入时可以用iomainp库中的setprecision和fixed函数来输出保留小数位数。

代码语言:javascript复制
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    int num = 123;
    double pi = 3.14159;
    // 输出整数
    cout << "The number is: " << num << endl;
    // 输出小数
    cout << "The value of pi is: " << pi << endl;
    cout << fixed << setprecision(2) << pi << endl;//保留两位小数 
    // 输出字符串
    cout << "Hello, World!" << endl;
    return 0;
}
二、printf

printf函数是C语言中的一个输出函数,用于将指定的格式化数据输出。跟scanf一样输出时要用%d等输出,在格式化输出上非常好用。

一般情况下,printf 比cout输出效率更高。

printf是C语言中的输出函数,而cout是C 中的输出流。是一个可变参数函数,可以接受任意数量和类型的参数,并按照格式化的方式输出。相比之下,cout是一个类型安全的输出流,它使用插入(<<)运算符来将数据插入到流中。printf的输出效率高主要是因为它是以低级别的系统调用方式来实现的。它直接使用底层的write函数将数据写入到文件描述符中,绕过了一些高级别的缓冲区和类型安全检查等操作。这使得printf可以更快地将数据输出到终端或文件。而cout则是一个面向对象的输出流,它使用了一些高级别的功能,如类型安全检查、缓冲区管理、输出流状态管理等。虽然这些功能为开发者提供了更多的灵活性和易用性,但也意味着在执行输出操作时需要更多的内存和处理时间。

代码语言:javascript复制
#include<stdio.h>

int main() {
    int num = 123;
    printf("The number is %dn", num); // 输出:The number is 123

    float f = 3.1415;
    printf("The value of pi is %.2fn", f); // 输出:The value of pi is 3.14

    char str[] = "Hello World";
    printf("The string is %sn", str); // 输出:The string is Hello World

    return 0;
}

格式控制符用于指定输出的格式,常用的格式控制符包括:

  • %d:输出一个有符号十进制整数。
  • %f:输出一个浮点数。
  • %s:输出一个字符串。
  • %c:输出一个字符。
  • %p:输出一个指针地址。
  • %x:输出一个无符号十六进制整数。
三、putchar

putchar函数用于单个字符的输出,putchar函数在输出单个字符时比较高效,因为它不需要进行格式化操作和缓冲区管理。它直接将字符输出到流中,省去了一些额外的开销。下面是一个简单的使用例子

代码语言:javascript复制
#include <stdio.h>

int main() {
    int c = 'A';
    putchar(c);
    return 0;
}
四、puts

在C / C 中,puts()函数用于在标准输出上打印字符串,并在最后自动添加换行符。在题目输出一个数组时,可以直接使用puts输出,省去了for循环输出。

代码语言:javascript复制
#include <stdio.h>
int main() {
    char str[] = "Hello, World!";
    puts(str);
    return 0;
}

该程序将打印出:"Hello, World!",并自动添加换行符。

参考博客

C 字符串的几种输入方法(string和字符数组)_c 输入字符串数组-CSDN博客

C 语言篇 字符数组与字符串输入_c 字符数组 输入溢出-CSDN博客

0 人点赞