scanf如何扫描字符串
熟悉的scanf
scanf 是我们学C语言时候最先接触到的,是用来接收输入的.出现的测试题很多都是从一个文件读取,我们就会用到 fscanf 如果用不好,就很麻烦
遇到什么字符结束?
默认是遇到 空格 tab键 换行,就结束一个串的扫描
如果我想要包含空格 tab 怎么办?
使用类似正则表达式的限定字符集合 用方括号括起来在% 和 s 之间 。例如: %[a-z 0-9]s 包含 a-z 空格和0-9 的串
有宽度的字符串如何截取
char buf[20] = {0};
scanf("%5s",buf,6); //6 包含了内容+\0 字符的长度
但是遇到 空格、tab、换行就要停止扫描和%s一样
比如上面例子: 输入 “he is a beautiful man” 就会得到 he
测试用例
使用
scanf
sscanf
fscanf
来作为例子说明一下
#include <iostream>
#include <stdio.h>
void test1()
{
const int MAX_BUF = 4096;
char buf[MAX_BUF] = {};
char buf1[MAX_BUF] = {};
scanf("%s%s",buf,buf1);
printf("%s %s\n", buf,buf1);
FILE* fp = fopen("d:\\test\\input.txt", "r");
fscanf(fp, "%s%s", buf, buf1);
printf("%s %s\n", buf, buf1);
}
void test2()
{
const int MAX_BUF = 4096;
char buf[MAX_BUF] = {};
scanf("%[a-z \t0-9]s", buf);
printf("%s\n", buf);
}
void test3()
{
const int MAX_BUF = 4096;
char buf[MAX_BUF] = {};
FILE* fp = fopen("d:\\test\\input.txt", "r");
fscanf(fp, "%[a-z \t0-9]s", buf);
printf("%s\n", buf);
}
void test4()
{
const int MAX_BUF = 4096;
char buf[MAX_BUF] = {};
char buf_input[MAX_BUF] = {"hello beijing"};
sscanf(buf_input,"%[a-z \t0-9]s", buf);
printf("%s\n", buf);
}
void test5()
{
const int MAX_BUF = 4096;
char buf[MAX_BUF] = {};
char buf_input[MAX_BUF] = {"hello beijingasfaskfj;lasdfj;lasfjdkasfjasldfjdasfjlasfjlfjasjoiweruweroiasdkfjdsjdasf"};
sscanf(buf_input, "%4096s", buf,4096);
printf("%s\n", buf);
}
void test6()
{
const int MAX_BUF = 4096;
char buf[20] = {};
scanf("%5s", buf,6);
printf("%s\n", buf);
}
int main()
{
test2();
test3();
test4();
test5();
test6();
}
- 参考微软的msdn.