由于OJ系统检测内存和算法时间对Java很不利,因此转行学习C++。
使用C语言的输入输出最节省时间
C
总结
gets 输入一行字符串
getchar 输入一个字符 包括空格、制表符和换行符
getline是C++的
scanf
【参考:C语言scanf:读取从键盘输入的数据(含输入格式汇总表)】
1.scanf()函数
原型:int scanf(const char *restrict format,…);
入口参数:第一个参数是格式字符串,它指定了输入的格式,…格式化后的字符串存取地址。
返回值:函数返回值为int类型,如果读取到了“文件结束”则返回EOF,EOF为Ctrl+z或者Ctrl+d。其他情况则返回int型数字,例如:int res = scanf("%d %d",&a,&b);如果a,b都读取成功,则返回2;如果a,b只读取成功了一个,则返回1;如果a,b都没有读取成功,则返回0.
区别
【参考:C语言 gets()和scanf()函数的区别 - wanghetao - 博客园】
gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。
char string[15]; gets(string); /*遇到回车认为输入结束*/
scanf("%s",string); /*遇到空格认为输入结束*/
所以在输入的字符串中包含空格时,应该使用gets输入。
scanf和gets获取字符串时的区别
在C语言中,能构获取字符串的函数至少有两个:
1.scanf()
所在头文件:stdio.h
语法:scanf(“格式控制字符串”,变量地址列表);
接受字符串时:scanf("%s",字符数组名或指针);
2.gets()
所在头文件:stdio.h
语法:gets(字符数组名或指针);
两者在接受字符串时:
1.不同点:
scanf不能接受空格、制表符Tab、回车等;
而gets能够接受空格、制表符Tab和回车等;
2.相同点:
字符串接受结束后自动加’\0’。
重点
【参考:C语言中scanf/getchar()和gets()输入问题集锦_何玉先先的博客-CSDN博客】
#include <stdio.h>
int main()
{
char ch1[10], ch2[10];
scanf("%s", ch1);
gets(ch2);
printf("%s\n", ch1);
printf("%s\n", ch2);
return 0;
}
情况一
输入:
asd空格123sd回车键
输出:
asd
空格123sd
情况二
输入:
asd回车
输出:
asd
回车
- 情况二
因为scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。而读取时遇到回车(/n)而结束的,这个/n会一起读入输入流缓冲区的,所以第一次接受输入时取走字符串后会留下字符/n,这样第二次的读入函数直接从缓冲区中把/n取走了,显然读取成功了,所以不会再从终端读取!这就是为什么这个程序只执行了一次输入操作就结束的原因!
【参考:C语言 getchar原理及易错点解析_Kevin.wang-CSDN博客】
#include <stdio.h>
int main()
{
char ch1[10], ch2[10];
scanf("%s", ch1);
getchar();// 吸收一个回车或空格
gets(ch2);
printf("%s\n", ch1);
printf("%s\n", ch2);
return 0;
}
情况一
输入:
asd空格123空格sd回车键
输出:
asd
123空格sd
情况二
输入:
asd回车键
123空格fg回车键
输出:
asd
123空格fg
第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入,舍弃最后的回车符。
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
字符串
【参考:c与c++定义字符串的异同_给你更好的-CSDN博客】
C语言中用字符型char来表示存储字符,没有C++里面的可以单独的字符串类型String;
所以C里面使用字符数组和字符指针来实现字符串功能;
C的字符数组只能在定义时一起赋值,以后只能给单个元素一一赋值;
char string0[10];
char string1[]=“prison break”;
char string2[100]=“michael scofield”;
1句表示定义个长度为10的字符串,但未赋值,2句表示定义了一个字符数组string1,并进行初始化,使得其长度自动为13(字符串”prison break"中的字符个数加上结尾的’\0’),3句定义了一个有100个元素的字符数组string2,并初始化了17个元素(“michael scofield”;加上结尾的’\0’)。
C语言本身是没有设置一种类型来定义字符串变量的,字符串的存储完全依赖于字符数组,但字符数组又不等于是字符串变量。在字符型一维数组存放字符串,并规定以字符’\0’作为字符串结束标志。
ASCII码值 0 表示空字符,空字符就是平时所说的字符 ‘\0’。
字符 ‘0’,ASCII码值为 48,如:“012” 字符串中的 0 表示字符 ‘0’。
数字 0, 所说的数字 0,就是平时说的十进制数字 0,其ASCII码为 0,在字符串中表示 ‘\0’,即空字符。
【参考:C语言遍历字符串的两种方式(代码)_Aiden_yan的博客-CSDN博客】
【参考:【C语言】关于遍历字符串的三种方法_请赐予我力量-CSDN博客】
- strlen 字符串的长度不包括’\0’
一.使用指针
#include <stdio.h>
#include <string.h>
int main()
{
char* s = "You are beautiful!";
for (int i = 0;i < strlen(s);i++)
{
printf("%c", s[i]);
}
return 0;
}
// You are beautiful!
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 1024
int main()
{
char src[MAX_SIZE] = {0};
char *temp = src;
printf("Please input string : ");
gets(src);
printf("string = ");
while (*temp != '\0')
{
printf("%c", *temp);
temp++;
}
printf("\n");
return 0;
}
二.字符数组的方式
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
int main()
{
char src[MAX_SIZE] = {0};
printf("请输入一个字符串 : ");
gets(src);
printf("您输入的字符串为 : ");
// char src[] = "You are beautiful!";
// char src[] = { "You are beautiful!" };
for (int i = 0; i < strlen(src); i++)
{
printf("%c", src[i]);
}
return 0;
}
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 1024
int main()
{
char src[MAX_SIZE] = {0};
int i = 0;
printf("Please input string : ");
gets(src);
printf("string = ");
// char src[] = "You are beautiful!";
while (src[i] != '\0')
{
printf("%c", src[i]);
i++;
}
printf("\n");
return 0;
}
【参考:C++ 字符串与字符数组 详解_ZeroZone零域的博客-CSDN博客】
C语言字符串的输入和输出
【参考:C语言字符串的输入和输出】
C++
刷题
#include<bits/stdc++.h>//万能头文件
ios::sync_with_stdio(false);
//cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,
//导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,
//可以节省许多时间,使效率与scanf与printf相差无几
String类怎么用scanf读取
【参考:c++中String类怎么用scanf读取_huqiaolong的博客-CSDN博客】
在用scanf读取时,必须声明长度。不声明长度,直接scanf会出现运行时错误。
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
string a;
a.resize(100); //需要预先分配空间
scanf("%s", &a[0]);
puts(a.c_str());
return 0;
}
输入
【参考:C++中各种输入函数的用法总结 - 强威 - 博客园】
cin
cin函数遇到空格、TAB、换行时读取结束
输入字符串
#include <iostream>
using namespace std;
void main ()
{
char a[10];
cin>>a;
cout<<a<<endl;
}
输入:aaabbbccc
输出:aaabbbccc
输入:aaa bbb ccc
输出:aaa
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
cin >> s;
cout << s;
return 0;
}
123 456 jkl
123
cin.get()
刷题
【参考:C语言scanf和printf在刷题中的注意点 (用scanf和printf替换cin和cout,加快速度) - 拾月凄辰 - 博客园】
scanf、printf比cin、cout速度要快,而且很多时候使用cin会超时,但scanf不会超时,建议以后都用scanf处理输入,printf处理输出。
记住以下4点建议:
-
scanf读入double类型只能用
%lf
,读入float类型只能用%f
-
printf对于double和float都只能用
%f
,因为printf没有%lf (可能有些系统允许,但是最好坚持使用%f) -
printf输出string类型要用
%s
,而且必须使用c_str()
将string转为const char*再输出
printf("%s\n", a.c_str());