我目前正在尝试查找字符串的子字符串,但也允许用户选择是区分大小写还是不区分大小写。我意识到它只是在读匹配词的第一个字母。。我不知道如何读取整个子字符串。我刚开始学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");
}