C 检查字符串中是否有子字符串,并使字符串的字符大写(当在其中找到子字符串时)

C 检查字符串中是否有子字符串,并使字符串的字符大写(当在其中找到子字符串时),c,C,我需要写的是: 1.从用户处获取主字符串 2.从用户处获取子字符串 主字符串中子字符串的每个匹配项都将其字母更改为大写 不要使用字符串的函数,比如strstr 例如: 主字符串:ABCDEFFGHFKFF 子字符串:ff 输出:ABCDEFFGHFKFFF 问题:在找到一个匹配项后,我很难继续编写代码。例如,在我在主字符串中找到第一个“f”后,如何继续检查第二个“f”是否与找到的“f”相邻,如果不相邻,则尝试找到另一个“f”并检查子数组的后续匹配项,直到我们发现s的长度ubstring匹配字符串

我需要写的是:

1.从用户处获取主字符串

2.从用户处获取子字符串

主字符串中子字符串的每个匹配项都将其字母更改为大写

不要使用字符串的函数,比如strstr

例如:

主字符串:ABCDEFFGHFKFF

子字符串:ff

输出:ABCDEFFGHFKFFF

问题:在找到一个匹配项后,我很难继续编写代码。例如,在我在主字符串中找到第一个“f”后,如何继续检查第二个“f”是否与找到的“f”相邻,如果不相邻,则尝试找到另一个“f”并检查子数组的后续匹配项,直到我们发现s的长度ubstring匹配字符串中后续匹配的数量?以下是我在“replaceSubstring”函数中编写for循环逻辑时尝试的内容

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

#define N 101
void replaceSubstring(char *str, char *subStr);

void main()
{
    char str[N], subStr[N];
    while (strlen(str) != 0 || strlen(subStr) != 0)

    {
        str[0] = 0;
        printf("Enter text: ");
        gets(str);
        printf("Enter substring: ");
        scanf("%s", subStr);

        replaceSubstring(str, subStr);

    }
}

void replaceSubstring(char *str, char *SubStr)
{
    int  i, count = 0, j = 0, k = 0;

    for (i = 0; i <= strlen(str); i++)
    {
        if (str[i] == SubStr[k])
        {
            k++;
            count++;
            if (count == strlen(SubStr))
            {
                str[i] -= 32;
            }
            

        }
    }
    puts(str);
    getchar();
}
您可以使用strstr函数更轻松地执行此操作,如下所示:

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

#define N 101
void replaceSubstring(char *str, char *subStr);

void main()
{
    char str[N], subStr[N];
    while (strlen(str) != 0 || strlen(subStr) != 0)

    {
        str[0] = 0;
        printf("Enter text: ");
        gets(str);
        printf("Enter substring: ");
        scanf("%s", subStr);

        replaceSubstring(str, subStr);

    }
}

void replaceSubstring(char *str, char *SubStr)
{
    int  i;
    char *tmp;

    while((tmp = strstr(str, SubStr)) != NULL)
    {
        for (i = 0; i < strlen(SubStr); i++)
        {        
            tmp[i] -= 32;
        }
    }
    puts(str);
    getchar();
}
void replaceSubstring(char *str, char *SubStr)
{
    int  i = 0, equals = 0, j = 0, k = 0;
    for(i=0;i<strlen(str);i++){
        j = i;
        equals = 1;
        k=0;
        while(k<strlen(SubStr)&&(equals == 1)){
            if(SubStr[k] != str[j]){
                equals = 0;
            }
            k++;
            j++;
        }
        if(equals == 1){
            for(j=i;j<i+k;j++){
                str[j] -= 32;
            }
        }
    }
    puts(str);
    getchar();
}

下面是一个演示程序,演示如何编写函数

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

char * replaceSubstring( char *s1, const char *s2 )
{
    char *p = s1;
    size_t n = strlen( s2 );

    while ( ( p = strstr( p, s2 ) ) != NULL )
    {
        for ( size_t i = 0; i < n; ++i, ++p  ) *p = toupper( ( unsigned char )*p );     
    }

    return s1;
}

int main( void )
{
    char s[] = "abcdeffghfhkfff";

    puts( s );
    puts( replaceSubstring( s, "ff" ) );
}
考虑到根据C标准,无参数的主要功能应声明如下`

int main( void )
同样,在这个语句中使用像32这样的幻数也是个坏主意

tmp[i] -= 32;
例如,如果在环境中使用EBCDIC字符,则此语句将完全错误


此外,即使对于ASCII字符,此语句也是无效的,因为原始字符不必使用小写。

要解决此问题而不使用strstr,我将执行以下操作:

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

#define N 101
void replaceSubstring(char *str, char *subStr);

void main()
{
    char str[N], subStr[N];
    while (strlen(str) != 0 || strlen(subStr) != 0)

    {
        str[0] = 0;
        printf("Enter text: ");
        gets(str);
        printf("Enter substring: ");
        scanf("%s", subStr);

        replaceSubstring(str, subStr);

    }
}

void replaceSubstring(char *str, char *SubStr)
{
    int  i;
    char *tmp;

    while((tmp = strstr(str, SubStr)) != NULL)
    {
        for (i = 0; i < strlen(SubStr); i++)
        {        
            tmp[i] -= 32;
        }
    }
    puts(str);
    getchar();
}
void replaceSubstring(char *str, char *SubStr)
{
    int  i = 0, equals = 0, j = 0, k = 0;
    for(i=0;i<strlen(str);i++){
        j = i;
        equals = 1;
        k=0;
        while(k<strlen(SubStr)&&(equals == 1)){
            if(SubStr[k] != str[j]){
                equals = 0;
            }
            k++;
            j++;
        }
        if(equals == 1){
            for(j=i;j<i+k;j++){
                str[j] -= 32;
            }
        }
    }
    puts(str);
    getchar();
}

在一次不匹配之后,以及在成功之后,您忘记了重置k=0。旁白:对于i=0,我尝试将问题分为更小的问题。例如:在从位置Pos开始的字符串中是否可以找到大小为Len的子字符串?更改从位置Pos开始的字符串中L字母的大小写。需要了解的主要问题是,您必须首先搜索first字符匹配,然后检查字符串其余部分是否匹配。使用第二组计数器匹配字符串其余部分,这样您就不会失去在主字符串中的位置。为了澄清此过程,您甚至可以使用第二个函数匹配字符串其余部分并大写,感谢您的注释。我已经升级了d我的代码。@WeatherVaneThank谢谢。虽然我确实想让我的代码在没有strstr的情况下工作。我已经更新了我的响应,但我添加了一个新版本的replaceSubstring函数,而没有使用strstr函数。
input: abcdeffghfhkfff
substring: ff
output: abcdeFFghfhkFFf