strstr
严格区分大小写
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
char str[]="abc123";
char str2[] = "123";
char str3[] = "1";
strrev(str);
printf("%s\n",str);
//输出》》321cba
printf("%d\n",strstr(str,str2));//失败返回null;
//输出》》0
printf("%s",strstr(str,str3));//成功返回父串 从第一次出现的位置开始的char*
//输出》》1cba
}
strcasestr
跟strstr一样使用,但是不区分大小写
strrev
对字符串进行反序,返回是char*指针,传进去的字符串也会改变
有的编译器不支持strtrv函数
char * my_strrev(char *str)
{
char *right = str;
char *left = str;
char ch;
while (*right) {
right++;
}
right--;
while (left < right)
{
ch = *left;
*left++ = *right;
*right-- = ch;
}
return(str);
}
strncpy
char *strncpy(char *dest, const char *src, int n)
把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest。
AC代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char * my_strrev(char *str)
{
char *right = str;
char *left = str;
char ch;
while (*right) {
right++;
}
right--;
while (left < right)
{
ch = *left;
*left++ = *right;
*right-- = ch;
}
return(str);
}
char str[100][101];
int n;
int searchMax(char* source){
int sublen = strlen(source);
int len = strlen(source);
char substr[101],revstr[101];
int found;
while(sublen>0){//从尾巴减
//从头减
for(int i=0;i<=(len-sublen);i++){
found = 1;
strncpy(substr,source+i,sublen);
strncpy(revstr,source+i,sublen);
substr[sublen]='\0';
revstr[sublen]='\0';
my_strrev(revstr);
//比较
for(int j=0;j<n;j++){
if(strstr(str[j],substr)==0 && strstr(str[j],revstr)==0){
found = 0;
break;
}
}
if(found==1)
return (sublen);
}
sublen--;
}
return 0;
}
int main(){
int t,answer;
char minStr[101];
scanf("%d",&t);
for(int i=0;i<t;i++){
scanf("%d",&n);
int min=101;
for(int j=0;j<n;j++){
//输入
scanf("%s",str[j]);
//找最小串
if(strlen(str[j])<min){
strcpy(minStr,str[j]);
min=strlen(str[j]);
}
}
//找最大子串
answer = searchMax(minStr);
printf("%d\n",answer);
}
return 0;
}