Tại sao sau khi ra khỏi vòng if, không return được giá trị biến?

Dưới đây là một prototype mà mình viết mô phỏng lại lệnh strchr trong string.h. Trong đó

str = ThisIsASample
CharacterSearch = 'S'
char subStr[100]={0};
char* SearchNumber(const char* str, int CharacterSearch)
{
    int j=0;
    for (int i=0;i<len;i++)
    {
        if (str[i]==CharacterSearch)
        {
            for (int j=0;i<len;i++)
            {
                subStr[j]=str[i];
                j++;
            }
        return subStr; //Neu dat return tai day thi subStr="Sample"
        }
        return subStr; //Neu dat return ngoai day thi subStr=(NULL)
    }

Không biết có ai giải thích cho mình được không ? Mình xin cảm ơn :slight_smile:

Em nghĩ là do khi vòng lặp chạy ở vị trí mảng str[0] tức i = 0, nó kiểm tra điều kiện if không thấy thỏa mãn, xong nó thực hiện câu lệnh tiếp theo sau if là return và nó thoát hàm và trả về luôn ạ. Nếu sửa lại thì anh nên đặt ngoài vòng lặp.

Em nghĩ anh có thể chạy tay hàm chuẩn để hiểu thêm:
https://clc-wiki.net/wiki/C_standard_library:string.h:strchr

hoặc là:
https://opensource.apple.com/source/BerkeleyDB/BerkeleyDB-18/db/clib/strchr.c.auto.html

3 Likes

Code này bạn copy ai hả? Chớ logic rành rành ra đó rồi có gì đâu ko hiểu?
Chạy ngay lần đầu tiên chữ ‘T’! = ‘S’ ko thỏai if thì return chuỗi rỗng là đúng rồi.

4 Likes

Ái chà, giờ mới biết người ta có viết thằng này. Hồi đó cứ lục trong library của phần mềm.
Thankss :slight_smile:

Còn về cách sửa của bạn, nó vẫn không return ra như khi đặt trong if, chỉ có khoảng trắng thôi (và th đặt return trong vòng lặp cũng thế)

image
Đặt trong if

image
Không đặt trong if

Nếu sửa lại thì anh nên đặt ngoài vòng lặp.

Ý của em là để return subStr ở cả ngoài 2 vòng lặp luôn ạ, như vầy:

char* SearchNumber(const char* str, int CharacterSearch)
{
    int j=0;
    for (int i=0;i<len;i++)
    {
        if (str[i]==CharacterSearch)
        {
            for (int j=0;i<len;i++)
            {
                subStr[j]=str[i];
                j++;
            }
        }
    }
    return subStr; //Neu dat return tai day thi subStr="Sample"
}

Khi anh gọi hàm ở hàm main thì sẽ cho kết quả “Sample”:

printf( "%s", SearchNumber( "ThisIsASample", 'S') );

Còn nếu anh muốn trả về trong if, thì hàm sẽ được hiểu là tìm được ký tự đầu tiên xong nó sẽ ra thoát và trả về giá trị mà anh mong muốn. Còn nếu anh trả về ở cuối (giống em) thì nó sẽ tìm ‘S’ xuất hiện cuối cùng và in từ đó tới cuối chuỗi (trong trường hợp có 2 ký tự ‘S’ trong chuỗi).

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?