gets strtok sscanf 实现读入一行并分割字符

这篇博客介绍了如何在C语言中利用gets、strtok和sscanf三个函数组合来读取一行输入,并对字符进行分割。文中提到了strtok的使用方法,包括首次调用时传入字符串指针,后续调用传入NULL,以及该函数会改变原始字符串。还提及了类似功能的strtok_r和strsep函数。

http://www.cnblogs.com/hoys/archive/2011/09/19/2180999.html

http://www.cnblogs.com/longzhao1234/archive/2012/05/31/2528317.html

gets strtok sscanf 组合实现读入一行,分割字符

 类似strtok功能还有 strtok_r 和 strsep


strtok使用

(1)第一次传字符串指针(不能指向常量),之后传NULL

(2)使用后字符串被改变

(3)返回值p

#include<stdio.h>
#include<string.h>

#include <sstream>
using namespace std;

char s[1000];
int main()
{
    while (gets(s))
    {
        char *p = strtok(s, " ");
        while (p)
        {
            int x;
            sscanf(p,"%d", &x);
            printf("%d*", x);
            p = strtok(NULL, " ");
        }
        puts("");
    }

    while (gets(s))
    {
        int x;
        istringstream ss(s);
        while (ss >> x)
        {
            printf("%d*", x);
        }
        puts("");
    }

//    while (gets(s))
//    {
//        char *pp;
//        char *p = strtok_r(s, " ", &pp);
//        while (p)
//        {
//            int x;
//            sscanf(p,"%d", &x);
//            printf("%d*", x);
//            p = strtok_r(NULL, " ", &pp);
//        }
//        puts("");
//    }
//
//    while (gets(s))
//    {
//        char *p = strsep(&s, " ");
//        while (p)
//        {
//            int x;
//            sscanf(p,"%d", &x);
//            printf("%d*", x);
//            p = strsep(&s, " ");
//        }
//        puts("");
//    }
    return 0;
}
/**
#include<stdio.h>
#include<string.h>
#define INFO_MAX_SZ 255
int main()
{
    int in=0;
    char buffer[INFO_MAX_SZ]="Fred male 25,John male 62,Anna female 16";
    char *p[20];
    char *buf=buffer;

    char *outer_ptr=NULL;
    char *inner_ptr=NULL;

    while((p[in]=strtok_r(buf,",",&outer_ptr))!=NULL) {
        buf=p[in];
        while((p[in]=strtok_r(buf," ",&inner_ptr))!=NULL) {
            in++;
            buf=NULL;
        }
        p[in++]="***";
        buf=NULL;
    }

    printf("Here we have %d strings\n",i);
    for (int j=0; jn<i; j++)
        printf(">%s<\n",p[j]);
    return 0;
}
*/


输入 - 第 1 行:包含两个整数K、M,以空格分隔.其中K表示需输出的字符数,M表示字符串长度的上限. - 第 2 行:包含字符串S,表示初始字符串. - 第 3 行:包含整数N,表示操作次数. - 接下来的N行中,第i行(1 <= i <=N)包含三个整数A_i、B_i、C_i,以空格分隔.表示第i次操作是将从位置A_i到位置B_i的子串复制,插入到位置C_i处. 输出 输出执行 N 次操作后所得字符串的前 K 个字符,占一行。 样例输入 Copy 2 18 copypaste 4 3 6 8 1 5 2 4 12 1 17 18 0 样例输出 Copy ac 提示 在这个例子中,N=4 次复制与粘贴操作按如下方式进行: 初始字符串为 copypaste。 第 1 次操作中,从位置 3 到位置 6 的子串 ypa 被复制,在位置 8 插入粘贴,得到字符串 copypastypae。 第 2 次操作中,从位置 1 到位置 5 的子串 opyp 被复制,在位置 2 插入粘贴,得到字符串 coopyppypastypae。 第 3 次操作中,从位置 4 到位置 12 的子串 yppypast 被复制,在位置 1 插入粘贴,得到字符串 cyppypastooypyppypastypae,但由于长度超过 M=18,因此从右端开始删除字符,最终得到字符串 cyppypastooypyppypa。 第 4 次操作中,从位置 17 到位置 18 的子串 a 被复制,在位置 0 插入粘贴,得到字符串 acypypastooypyppypa,但由于长度超过 M=18,因此从右端开始删除字符,最终得到字符串 acypypastooypyppyp。 因此,操作后字符串 acypypastooypyppyp 的前 K=2 个字符为 ac,输出该结果 用c语言实现这个算法
最新发布
11-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值