簡體   English   中英

C中的字符串(strstr函數)

[英]Strings in C (strstr function)

我試圖重現strstr() function 的行為,它試圖在字符串中找到 substring,為此我創建了以下 function 並將其與原始字符串進行比較。 我在紙上做了所有迭代以了解 function 中發生了什么,但我不明白為什么命令return (&str[i]); 打印ab而不僅僅是a 當 function 輸入if (to_find[j] == '\0')時, ij的值為22 ,所以它應該只打印&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)相同。
  • return語句只是表示返回this指針。

現在,在調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM