好吧,scanf家族函数很强大。
3、去除1个字符串中包含另一个字符串的字符
下面介绍几个例子
1、输入文件,输出字符串数大于80的行
#include <stdio.h>
#include <stdlib.h>
/*a数组的长度至少为n+2*/
void fun(char a[], int n)
{
int i;
char s[18], t[18];
//输出大于n的行,构造输入表达式如%80[^\n],以换行符为结束
sprintf(s, "%%%d[^\n]", n+1);
sprintf(t, "%%%d[^\n]%%c", n);
for (scanf("%[\n]", a); (i = scanf(t, a, a+n+1)) != EOF; scanf("%[\n]", a)) {
if (i == 2 && a[n+1] != '\n') {//如果输入两个参数,且第二个参数不是换行符,说明是遇到大于n的行
printf("%s%c", a, a[n+1]);
while (scanf(s, a) > 0) {
printf("%s", a);
}
printf("\n");
}
}
}
int main(void)
{
char a[11] = "asd";
freopen("hello.txt", "r", stdin);
fun(a, 10);
freopen("CON", "r", stdin);
return 0;
}
2、去除形如/**/的注释
#include <stdio.h>
#include <stdlib.h>
void fun(void)
{
int i;
char a[11], flag;
while ((i = scanf("%10[^\"/]%c", a, &flag)) != EOF) {
printf("%s", a);
if (i == 2) {
if(flag == '"') {
putchar('"');
while (scanf("%10[^\"]", a) > 0) {
printf("%s", a);
}
scanf("%c", &flag);
putchar('"');
} else if(flag == '/') {
scanf("%c", &flag);
while (scanf("%*[^*]%[*]", a) > 0) {
scanf("%c", &flag);
if (flag == '/') {
break;
}
}
} else {
putchar(flag);
}
}
}
}
#include <stdio.h>
#include <stdlib.h>
char *squeeze(char s1[], const char s2[])
{
char a[100];
sprintf(a, "%%[^%s]", s2);//以s2字符串过滤s1字符串
if (sscanf(s1, a, s1) == 0) {
s1[0] = 0;
}
return s1;
}
int main(void)
{
char s1[10], s2[10];
freopen("hello.txt", "r", stdin);
while (scanf("%s%s", s1, s2) != EOF) {
printf("%s\n", squeeze(s1, s2));
}
freopen("CON", "r", stdin);
return 0;
}
4、16进制字符串转化为数字
#include <stdio.h>
#include <stdlib.h>
void htoi(char str[], int *val)
{
sscanf(str, "%x", val);
}
int main(void)
{
char str[20];
int val;
while (scanf("%s", str) != EOF) {
htoi(str, &val);
printf("%d\n", val);
}
return 0;
}
。。。简单的正则式表达,威力无穷啊。。