C代码系列 #002_C语言中的%*格式控制问题

本文讨论了C语言中%*格式控制的问题,解释了如何使用%*进行虚读,以在输入数据中跳过指定部分。通过测试代码展示%*如何将输入字符串断开,以便更有效地读取和处理数据。同时提出了一个算法题,要求利用%*(^0-9)的格式控制来从字符串中提取整数并求和。

C语言 %* 格式控制问题

  • 问题:%*[]或%*[^]的输入虚读和分割
  • 功能:*c的作用是读入\n,否则后面读入的将一直是\n,使用*将在输入数据中跳过一项(各项用空格分隔),不赋值给任何变量,即虚读。
  • 理解:可以理解为*虚读将输入字符串断开,分成多个输入来读入。

测试代码一

#include <stdio.h>
int skip(){
     scanf("%*[^0-9]");
     return 1;
}
void main()
{
    int n,x,y,count = 0;
      while(skip() && scanf("%d", &n)!=EOF)
      {
      	printf("%d,%d\n", n,count);
      	count++;
	  }
        
}

输入 
abc123abc123
输出 
1231
1232
说明循环体中的print函数执行了两次

测试代码二

#include <stdio.h>

bool skip()
{
     scanf("%*[^0-9]");
     return true;
}

void main()
{
      int n;
      while(skip() && scanf("%d", &n)!=EOF)
        printf("%d\n", n);
}

/*
输入:
1234ABC89

输出为:
1234
86
*/
  • 总结:*虚读将输入字符串断开,分成多个输入来读入 。
    输入相当于变成:1234 86

算法题(提高数字读入效率)

求用scanf(%*(^0-9))解下面的题:

Description
GHacker最近痴迷于一个新上市的解谜游戏,其中一关的过关是破解一个字符串S。经过3天的冥思苦想,GHacker成功的搞明白了这其中的奥秘,把串S中的整数取出来求和,就可以过关了。但是GHacker的数学实在糟糕。他无法在短暂的时间内算出来,只好求助Jackie。Jackie观察到虽然每次出现的数字不同,但是其它的符号并不会变化。于是Jackie编写了一个非常短的程序,帮助GHacker把这一关过了。

Input
输入为串S,只有一行。

Output
串S中用非数字(0~9)分隔开的非负整数之和,不会超出int类型的数据范围。

Sample Input
`13?:[7514],54.487=="(438922x159??392)%032\n111cdef120$95;

Sample Output
447899

HINT
scanf()可以解决这个问题,注意转义字符和格式控制字符

#include <stdio.h>

int main( void )
{
    const char* s = "`13?:[7514],54.487==\"(438922x159??392)%032\\n111cdef120$95;";
    unsigned sum = 0;
    for( int i=0; ; )
    {
        int j = 0;
        sscanf( s+i, "%*[^0-9]%n", &j );
        i += j;

        unsigned val;
        int n = sscanf( s+i, "%u%n", &val, &j );
        if( n != 1 )
            break;
        i +=j;

        sum += val;
    }
    printf( "%u\n", sum );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值