目录
scanf的基本定义
周知众所C++有一个输入函数"scanf"他在<stdio.h>库中
定义如下:scanf("样式表,例如%d %s %c...",&变量名称...)
注意: 变量名称是和样式表对应的,请在样式表里面不要加无关的东西(除外%d %s...的东西)[后面也会讲到加其他东西]
这是普通的输入代码:
#include <stdio.h>
int main(){
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",a+b);
}
输入 : 1 2
输出 : 3
输入 : 1(换行)
2
输出 : 3
假如在参数表加入其他东西:
#include <stdio.h>
int main(){
int a,b;
scanf("a=%d b=%d",&a,&b);
printf("%d %d %d\n",a,b,a+b);
}
从这可见样式表里多了"a=%d b=%d"后,必须要加上a=.. b=..才可以正常运行
样式表加入其他东西的用法
先上题目:
题目描述:
按照a*b=的格式输入算式,通过计算输出a*b的结果。
输入格式:
输入中包括一个表达式,如:a*b= a和b都是int类型的正整数。
输出格式:
结果只有一个正整数,整数在long long范围内。
输入样例:
12*11=
输出样例:
132
普通做法:
#include <stdio.h>
#include <string>
using std::string;
int main(){
string str;
scanf("%s",str.c_str());
int a=0,b=0,i=0;
for(;str[i]!='*';i++){
a*=10;
a+=int(str[i]-'0');
}
i++;
for(;str[i]!='=';i++){
b*=10;
b+=int(str[i]-'0');
}
long long int sum=a*b;
printf("%lld\n",sum);
}
这个代码用了string类型先输入,然后再判断,找出两个数字
用scanf样式表的做法:
#include <stdio.h>
int main(){
int a,b;
scanf("%d*%d=",&a,&b);
long long s=a*b;
printf("%lld\n",s);
}
功能都一样,前后一对比,前面的很难懂,后面的小白都看的懂
原理:
这个就用了scanf的必须输入"*"和"="号的原理,刚好可已舍去*和=号,就用了*来分割
关于scanf输入const char*类型
某些百*gpt的答案:
可是我们一看代码(这里用<stdio.h>和<cstdio>头都一样的):
#include <cstdio>
int main() {
const char* str;
printf("请输入一个字符串: ");
scanf("%s", str); // 注意,这里需要为str分配足够的空间来存储输入的字符串
printf("你输入的字符串是: %s\n", str);
return 0;
}
运行结果:
也有可能是我编译器不行,所以我在这里建议大家使用<string>头的std::string
进阶:不会换行的“%[^\n]”
这个“%[^\n]”是什么意思呢?
先引入情境:你要写入一个字符串,而且是有空格的那种。可是scanf它遇到空格就会默认是写完了。
这种情况我们可以用getline()方法,可是他在<iostream>库里,不是c++完全没法引入,这时我们就可以用“%[^\n]”了。
都知道普通的情况下scanf遇到空格就停止读取:
#include <stdio.h>
int main(){
char a[99];
scanf("%s",&a);
printf("%s\n",a);
}
而“%[^\n]”可以让scanf知道:“遇到\n(换行)才停止读取”。
例如:
#include <stdio.h>
int main(){
char a[99];
scanf("%[^\n]s",&a);
printf("%s\n",a);
}
现在scanf就算学完了!