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