EOJ 3018 查找单词【指针练习】

题目简介


有一个单词 W,输出它在字符串 S 中从左到右第一次出现的位置 IDX(设 S 中的第 1 个字符的位置为 1)。W 只由英文字母组成,S 除英文字母和汉字之外在任何位置(包括头和尾)另有一个或多个连续的空格。

查找单词时,不区分大小写,但要求完全匹配,即单词 W 必须与 S 中的某一独立单词在不区分大小写的情况下完全匹配。W 仅是 S 中某一单词的一部分就不算匹配。

说明


算是比较恶心的字符串题了。输入数据保证用C++的string写会超时(雾),于是当作指针练习来写了。
不知道OJ编译器为什么不允许在getchar()后面加gets()。不过只要在scanf用一些小技巧就差不多能变成gets。
strlwr还需要自己写真麻烦

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

char *strlwr(char *s)
{
    char *str;
    str = s;
    while(*str != '\0'){
        if(*str >= 'A' && *str <= 'Z')
            *str += 'a'-'A';
        str++;
    }
    return s;
}

int main(void)
{
    int cas, t;
    scanf("%d", &cas);
    for (t = 0; t < cas; ++t){
        char w[11], s[1000001];
        getchar();
        scanf("%[^\n]", w);getchar();
        scanf("%[^\n]", s);
        int lenw = strlen(w), lens = strlen(s);
        strlwr(w);strlwr(s);
        s[lens] = ' ';s[lens + 1] = '\0';
        char *p, *pos = s;
        printf("case #%d:\n", t);
        while(1){
            p = strstr(pos, w);
            if (!p) break;
            if (p == s && *(s + lenw) == ' ') break;
            if (*(p - 1) == ' ' && *(p + lenw) == ' ') break;
            pos = p + lenw;
        }
        if (!p) printf("None\n");
        else printf("%d\n", p - s + 1);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值