scanf家族 正则式

好吧,scanf家族函数很强大。

下面介绍几个例子

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);
             }
         }
     }
}


3、去除1个字符串中包含另一个字符串的字符
#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;
}

。。。简单的正则式表达,威力无穷啊。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值