我在尝试检查字符串是否是另一个字符串的子字符串时遇到了一些问题。这是预期的输出:
Enter a source string: abc
Enter the target string: abcde
findSubstring(): 1
Enter a source string: abcde
Enter the target string: cdef
findSubstring(): -1
这是我使用strstr标准字符串库的代码:
int main()
{
char sourceStr[40], targetStr[40];
printf("Enter a source string: ");
gets(sourceStr);
printf("Enter the target string: ");
gets(targetStr);
printf("findSubstring(): %d\n", findSubstring(sourceStr, targetStr));
return 0;
}
int findSubstring(char *s, char *t) {
if (strstr(s, t) != NULL) {
return 1;
}
return 0;
}
使用这些代码,它可以完美运行。但是,我被告知我不应该使用任何标准的字符串库,所以我在想如何修改它?
很抱歉发布没有错误的问题,但我认真地需要一个良好的开端,因为我google了很长一段时间,我仍然不知道该怎么做。
提前致谢。
答案 0 :(得分:1)
这里的关键是当在C中工作时,字符串不像C ++的STL(std :: string)或Java的String对象那样作为实际数据结构存在。
相反,你应该将它们视为一系列单个字符,其结尾由商定的约定表示,在这种情况下是'NULL'字符,它是值0并且可以表示为使用转义符号的字符串文字。
这就是为什么字符串作为C中指向char的指针传递的原因,它实际上指向序列中的第一个字符。
因此,您可以使用指针运算来检查后续字符,直到找到值0,这意味着字符串已结束。
通过使用这样的代码段,您可以按字符检查任何给定的字符串。
char * pointer_to_string; //Pointer to start of string
char * pointer_to_character = pointer_to_string; //Start at the first character
while (*pointer_to_character != '\0'){ // Repeat while we haven't found the end
char c = *pointer_to_character; // The character the pointer is pointing to.
//do what you need to with the character
pointer_to_character++; //Now it points to the next character
}
// We exit the loop once the end of the string is found
<强>但是:强> 这意味着你必须要小心,因为这种字符串操作有风险,因为你依赖于找到一个结束字符串的实际NULL字符,如果它不存在,循环将无限期地运行,而在更复杂的例子中,容易导致分段错误和崩溃。
简而言之,当在C中使用原始指针时,必须格外小心你对底层内存的处理方式,当然使用已知的库而不是重新发明轮子往往是最好的选择,但是因为我倾向于相信赋值的目的是学习字符串表示和指针算法,我们将这样做。
有了这个,你应该能够弄清楚你需要做些什么来解决问题。
答案 1 :(得分:1)
好吧,如果你不想使用标准库,这是一种方法。 这是满足目的的简单代码:
int FindString(char *Str,const char *SubStr)
{
size_t count = 0 , x , y ;
size_t Str_len = strlen( Str ) ;
size_t SubStr_len = strlen( SubStr );
size_t diff = Str_len - SubStr_len;
if( SubStr_len > Str_len )
return 0;
for( x = 0 ; x <= diff ; x++ )
{
for( y = 0 ; y < SubStr_len ; y++ )
{
if( Str[ x + y ] == SubStr[ y ] )
count++;
else
{
count = 0;
break;
}
}
if( count == SubStr_len )
return 1;
}
return 0;
}
此外,如果您想要不敏感地比较的版本,请在评论中通知我。