![](/img/trans.png)
[英]Create the strstr function in C from scratch, but with modified strings
[英]Strings in C (strstr function)
我試圖重現strstr()
function 的行為,它試圖在字符串中找到 substring,為此我創建了以下 function 並將其與原始字符串進行比較。 我在紙上做了所有迭代以了解 function 中發生了什么,但我不明白為什么命令return (&str[i]);
打印ab
而不僅僅是a
。 當 function 輸入if (to_find[j] == '\0')
時, i
和j
的值為2
和2
,所以它應該只打印&str[2]
,這是a
. 為什么打印ab
而不是a
?
#include <stdio.h>
#include <unistd.h>
#include <string.h>
char *ft_strstr(char *str, char *to_find)
{
int i;
int j;
i = 0;
if (*to_find == '\0')
return (str);
while (str[i] != '\0')
{
j = 0;
while (str[i + j] == to_find[j])
{
//printf("%d", i);
//printf("%d\n", j);
j++;
if (to_find[j] == '\0')
return (&str[i]);
}
i++;
}
return (0);
}
int main()
{
char i[] = "ab";
char dest[] = "a ab";
printf("%s", ft_strstr(dest, i));
//printf("%s", strstr(dest, i));
}
return (&str[i]);
這是做什么的:
str[i]
這與*(str+i)
相同。 意思是取str
指向的地址,加上i
,得到它的值。&x
表示獲取x
的地址(&str[i])
是以上兩者的組合。 意思是取str
指向的地址,加上i
得到它的值,然后得到那個值的地址。 這意味着最后兩個步驟相互抵消,你得到:獲取str
指向的地址,將i
添加到它。 它與(str+i)
相同。 現在,在調用ft_strstr(dest, i)
之后,您將獲得此指針。 在您的情況下,此指針指向字符串"a ab"
中的第二個 a 。 您將此指針指向printf()
並使用"%s"
告訴printf()
打印此指針指向的字符串,直到出現'\0'
字節。 'b'
不是'\0'
字節,因此它也會被打印出來。
調用printf()
時返回的指針指向此處:
V
+---+---+---+---+---+
| a | | a | b |\0 |
+---+---+---+---+---+
然后printf()
將檢查它是否指向'\0'
字節,這是錯誤的,因此打印字節 ( 'a'
) 並遞增指針。 然后對字節 ( 'b'
) 進行同樣的操作,然后它指向'\0'
,這意味着printf()
在這里停止。
當您使用說明符%s
打印strstr
的返回值時,它將打印“the needle”(又名要查找的字符串)和 needle之后的所有原始字符串。
在你的情況下,針后沒有任何東西,所以你的 output 只是“ab”。 如果您的原始字符串是“a abHelloWorld”,您的 output 就會是“abHelloWorld”。
如果您只想要針的第一個字符,請執行以下操作:
printf("%c", *ft_strstr(dest, i));
您也可以嘗試這樣做以獲得更好的理解:
char str[] = "Hello World";
printf("%s\n", str);
printf("%s\n", &str[0]);
printf("%s\n", &str[1]);
printf("%s\n", &str[2]);
printf("%s\n", &str[3]);
...
這會給你 output
Hello World
Hello World
ello World
llo World
lo World
...
如您所見,從&str[n]
打印將跳過前 N 個字符並打印原始字符串的 rest。
順便提一句:
char *ft_strstr(char *str, char *to_find)
應該
char *ft_strstr(const char *str, const char *to_find)
return (&str[i]);
不打印任何東西。 它只是返回一個值。 值是 str 的第 i 個元素的地址。
打印發生在printf("%s", ft_strstr(dest, i));
這里發生的是你從一個格式字符串開始,而%s
是一個說明符,基本上說“打印字符直到遇到零終止符,並從指定的地址開始”。
printf("%s", ...)
打印一個字符串,而不是單個字符。 要打印字符,請使用%c
格式說明符並提供數組的第一個元素作為參數:
printf("%c", *ft_strstr(dest, i));
另一種選擇是使用putchar(...)
打印單個字符。
有關printf
格式說明符的更多信息,請參見此處。
在這個 while 循環中
while (str[i + j] == to_find[j])
{
//printf("%d", i);
//printf("%d\n", j);
j++;
if (to_find[j] == '\0')
return (&str[i]);
}
變量i
沒有被改變。 它保持不變。 正在更改的是變量j
。
另一方面,返回聲明
return (&str[i]);
返回指向 position i
處的符號的指針,該符號指向 substring 的開頭,等於字符串to_find
。
{注意數組dest
聲明為
char dest[]="a ab";
實際上有以下內容
char dest[] = { 'a', ' ', 'a', 'b', '\0' };
function 返回指向其 substring 的指針
char dest[] = { 'a', ' ', 'a', 'b', '\0' };
^
|
{ 'a', 'b', '\0' }
那是指向字符串"ab"
的第一個字符的指針,它是存儲在數組dest
中的字符串的 substring。
主要是當你寫的時候
printf( "%s\n", dest );
當此調用等同於
int i = 0;
printf( "%s\n", &dest[i] );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.