检查字符串中是否有子串,并将字符串的字符大写(当在那里找到子字符串时)

时间:2015-12-23 16:34:11

标签: c

我需要写的内容:

  

1.获取用户的主要字符串。

     

2.获取用户的子字符串。

     
      
  1. 主字符串中subString的每次匹配,将其字母更改为大写。

  2.   
  3. 请勿使用字符串函数,例如strstr。

  4.   

例如:

  

主要字符串:abcdeffghfhkfff

     

子字符串:ff

     

outut:abcdeFFghfhkFFf

问题:好吧,我找到一个匹配后继续编写代码时遇到了麻烦。例如,在我找到主字符串中的第一个'f'之后,我怎样才能继续检查第二个'f'是否与找到的'f'相邻,如果没有,则尝试找到另一个'f'并检查后续匹配直到我们发现子串的长度与字符串中后续匹配的数量匹配为止?这是我尝试过的,并在'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();
}

3 个答案:

答案 0 :(得分:1)

您可以使用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();
}

此处replaceSubstring()函数的另一个版本未使用strstr()函数:

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

    while (i < strlen(str))
    {    
        if (str[i] == SubStr[0])
        {
            found = 1;            
            for(k = 0; k < strlen(SubStr); k++)
            {
                if(str[i+k] != SubStr[k])
                {
                    found = 0;
                    break;
                }
            }
            if(found)
            {
                for(k = 0; k < strlen(SubStr); k++)
                {
                    str[i+k] -= 32;
                }
                i += strlen(SubStr);
            }
            else
                i++;
        }
        else
            i++;
    }
    puts(str);
    getchar();
}

答案 1 :(得分:1)

要在不使用strstr()的情况下解决这个问题,我会做这样的事情:

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();
}

我非常确定这是正常的。

input: abcdeffghfhkfff
substring: ff
output: abcdeFFghfhkFFf

答案 2 :(得分:0)

这是一个演示程序,显示如何编写函数

#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" ) );
}

它的输出是

abcdeffghfhkfff
abcdeFFghfhkFFf

考虑到根据C标准函数main,没有参数应声明为`

int main( void )

使用&#34; magic&#34;也是一个坏主意。像本声明中的32这样的数字

tmp[i] -= 32;

例如,如果在环境中使用了EBCDIC字符,则此语句将完全错误。

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