Week01-字符串比对(10分)

By | 最新修改:2024-08-17

声明

翁恺老师的 MOOC 课程 《C语言程序设计进阶》第一周的练习。(侵删)

我的答案只供参考,不能被用作其他人作为提交答案!

题目描述

字符串比对(10分)

题目内容:

题目说起来很简单,你会读到两个字符串,每个字符串占据一行,每个字符串的长度均小于10000字符,而且第一个字符串的长度小于第二个字符串的。你的程序要找出第一个字符串在第二个字符串中出现的位置,输出这些位置,如果找不到,则输出-1。

注意,第一个字符的位置是0。

注意,第一个字符串在第二个字符串中的位置可能不止一处。

注意,字符串中可能含有空格。

注意,两个字符串的长度一定大于0。

输入格式:

两个字符串,一行一个。

输出格式:

第一个字符串在第二个字符串中出现的位置,按照从小到大的顺序排列,每个数字后面有一个空格。

如果在第二个字符串中找不到第一个字符串,则输出-1。

输入样例:

abba

ababbba abbabbabbabbaacc

输出样例:

8 11 14 17

时间限制:500ms内存限制:32000kb

我的答案

/*================================================================
*   Copyright (C) 2019 程序知路. All rights reserved.
*   
*   Filename    :Week01-string_compare.c
*   Author      :程序知路
*   E-Mail      :admin@icxzl.com
*   Create Date :2019年11月16日
*   Description :
================================================================*/
#include <stdio.h>
#include <string.h>

#define MAXLINE 10000

/*
 * Find s2 from s1
 */
void string_compare(char* s1, const char* s2) {
    char found = 0;
    char* head = s1;
    char* p = NULL;
    int s1Len = strlen(s1);
    int s2Len = strlen(s2);
    while ( (s1 - head) < s1Len ) {
        if (( p = strstr(s1, s2) )) {
            // 找到
            printf("%ld ", p - head);
            found = 1;
            if (s2Len == 1) {
                s1 = p + 1; 
            } else {
                s1 = p + s2Len - 1;
            }
            continue;
        }
        ++ s1;
    }

    if (!found) {
        printf("-1");
    }
}

void getline(char* s) {
    int c;
    char* head = s;
    int len = 0;
    while (len < MAXLINE - 1) {
        c = getchar();
        if (c == '\n') {
            break;
        }

        ++ len;
        *s++ = c;
    }

    *s = '\0';
    s = head;
}

int main() {

    char s1[MAXLINE];
    char s2[MAXLINE];
    getline(s2);
    getline(s1);
    // printf("s2: %s\n", s2);
    // printf("s1: %s\n", s1);
    string_compare(s1, s2);

    return 0;
}

](/wp-content/uploads/2019/11/266fbb85-e16b-4bdf-a95a-79d95506450c.png)[

要注意 s2 只有一个有效字符的情况


程序知路

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com