如何在字符串中查找子字符串并使用C显示其索引



我目前正在尝试查找字符串的子字符串,但也允许用户选择是区分大小写还是不区分大小写。我意识到它只是在读匹配词的第一个字母。。我不知道如何读取整个子字符串。我刚开始学C!

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_LENGTH 255
char text[MAX_LENGTH], pattern[MAX_LENGTH], caseSelect;
char casesensitive;
int main(void) {
printf("Text:n");
//scanf("%254[^n]s", text);
fgets(text, MAX_LENGTH, stdin);
//printf("%s", text);
printf("Length of string: %dn", strlen(text));

printf("Match to:n");
fgets(pattern, MAX_LENGTH, stdin);

printf("Should match be case-sensitive?n");
scanf("%c", &caseSelect);
caseSelect = toupper(caseSelect);

if (caseSelect == 'N') {
for(int i = 0; pattern[i]; i++){
pattern[i] = tolower(pattern[i]);
} 
for (int i = 0; i < strlen(pattern); i++)
{
char *position_ptr = strchr(text, pattern[i]);
int position = (position_ptr == NULL ? -1 : position_ptr - text);
printf("Matches at position %d.n", position);
break;
}
} else if (caseSelect == 'Y') {
for (int i = 0; i < strlen(pattern); i++)
{
char *position_ptr = strchr(text, pattern[i]);
int position = (position_ptr == NULL ? -1 : position_ptr - text);
printf("Matches at position %d.n", position);
break;
}
} else {
printf("No Matches.n");
}
}

编辑:

您的代码中还有另一个问题(我的意思是,除了它单独搜索模式的每个字符,而不是搜索模式,这是通过使用strstr来解决的(:您正在使用fgets请求模式。

但是fgets在字符串中包含n(Return(。因此,除非您试图匹配字符串中的最后一个单词,否则它不会起作用,因为找不到"\n"。您必须删除n。例如pattern[strlen(pattern)-1]=''。或者使用注释中的scanf,而不是至少用于模式读取的fgets

以前的答案

这就是strstr为所做的

int ix;
if(caseSelect!='N') ix=strstr(text, pattern)-text;
else ix=strcasestr(text,pattern)-text;
printf("Matches at position %ld.n", ix);

注意:strstr返回指向包含模式中内容的文本字符的指针。例如:

text = "one two three";
pattern = "two";

如果text位于地址0x01234567;两个";in从地址0x0123456b开始。然后指针算术使这两个地址之间的减法=4。

完整代码

#define _GNU_SOURCE
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_LENGTH 255
char text[MAX_LENGTH], pattern[MAX_LENGTH], caseSelect;
char casesensitive;
int main(void) {
printf("Text:n");
//scanf("%254[^n]s", text);
fgets(text, MAX_LENGTH, stdin);
//printf("%s", text);
printf("Length of string: %ldn", strlen(text));

printf("Match to:n");
fgets(pattern, MAX_LENGTH, stdin);
pattern[strlen(pattern)-1]='';

printf("Should match be case-sensitive?n");
scanf("%c", &caseSelect);
caseSelect = toupper(caseSelect);

int position=0;
if (caseSelect != 'N') position=strstr(text,pattern)-text;
else position=strcasestr(text, pattern)-text;

if(position>=0) printf("Matches at position %d.n", position);
else printf("No Matches.n");
}

最新更新