【问题标题】:Check if substring in string, and make string's chars uppercase (when found a substring there检查字符串中的子字符串,并使字符串的字符大写(当在那里找到子字符串时
【发布时间】:2015-12-23 16:34:11
【问题描述】:

我需要写什么:

1.从用户那里获取主字符串。

2.从用户那里获取一个子字符串。

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

  2. 不要使用像strstr这样的字符串函数。

例如:

主字符串:abcdeffghfhkfff

子字符串:ff

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

【问题讨论】:

  • 你忘记在不匹配之后重置k = 0,并且在成功之后。
  • 旁白:for (i = 0; i &lt;= strlen(str); i++) 迭代太远,for (i = 0; i &lt; strlen(str); i++)
  • 尝试将问题分解为较小的问题。例如:大小为 Len 的 SubSring 是否可以在从位置 Pos 开始的 String 中找到?从位置 Pos. 开始更改 String 中 L 字母的大小写。
  • 要意识到的主要事情是您必须首先搜索第一个字符匹配,然后检查字符串其余部分的匹配。使用第二组计数器来匹配字符串的其余部分,这样您就不会失去在主字符串中的位置。为了澄清这个过程,你甚至可以使用第二个函数来匹配字符串的其余部分和大写
  • 感谢您的 cmets。我已经升级了我的代码。 @WeatherVane

标签: c


【解决方案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();
}

这里不使用strstr()函数的另一个版本的replaceSubstring()函数:

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

【讨论】:

  • 谢谢。虽然我确实想让我的代码在没有 strstr 的情况下工作。
  • 我已经更新了我的回复,我添加了一个新版本的replaceSubstring() 函数而不使用strstr() 函数。
【解决方案2】:

要在不使用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

【讨论】:

    【解决方案3】:

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

    #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 )
    

    在这个语句中使用像 32 这样的“神奇”数字也是一个坏主意

    tmp[i] -= 32;
    

    例如,如果在环境中使用了 EBCDIC 字符,那么这句话就是错误的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-18
      • 2012-09-07
      • 2011-07-13
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      相关资源
      最近更新 更多