簡體   English   中英

臭蟲str?

[英]Bug with strlen?

我剛開始使用C,並且剛開始嘗試通過函數找出通過引用進行的調用。 使用strlen()遍歷字符串並修改其內容時,我在輸出中注意到一個奇怪的結果。 在此示例中,strlen()的結果為3,不包括空字符,但是如果我沒有在for期間顯式檢查空字符(或使用小於strlen()的結果而不是小於或等於)循環,然后它在輸出中給出I ASSUME的異常字符是因為空字符?

請幫助這個菜鳥了解這里發生的事情。

碼:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void f_test_s(char s[]);
void f_test_s2(char s[]);

int main(){
    char s_test[] = "abc";

    f_test_s(s_test);
    f_test_s2(s_test);

    puts("\nTest complete!");

    return 0;
}


void f_test_s(char s[]){

    puts("Test #1: ");
    printf("string before: %s\n", s);

    int len = strlen(s);
    printf("strlen() = %d\n", len); 
    int i=0;             
    for(i=0;i<=len;i++){
        if(s[i] != '\0'){
            s[i]++;
        }
    }

    printf("string after: %s\n", s);

}


void f_test_s2(char s[]){

    puts("\nTest #2: ");
    printf("string before: %s\n", s);

    int len = strlen(s);
    printf("strlen() = %d\n", len);
    int i=0;         
    for(i=0;i<=len;i++){
        s[i]++;
    }

    printf("string after: %s\n", s);

} 

輸出:

Test #1: 
string before: abc
strlen() = 3
string after: bcd

Test #2: 
string before: bcd
strlen() = 3
string after: cde

Test complete!

如果有關系,我在Ubuntu上使用gcc版本7.3.0。 我絕對不是C,gcc或Ubuntu的專家。

這就是問題:

for (i = 0; i <= len; i++) {
    s[i]++;
}

它應該是:

for (i = 0; i < len; i++) {
    s[i]++;
}

s[len]是空字符(0)。 當您刪除空字符並將其替換為值1時,數組的內容現在為{'a', 'b', 'c', 0x1} 當printf嘗試打印s它將繼續打印超出數組的值存儲地址的字符,直到遇到空字符為止。 從技術上講,這是未定義的行為。

更改此:

for (i = 0; i <= len; i++) {

對此:

for (i = 0; i < len; i++) {

因為strlen()返回字符串的長度。 AC字符串的長度與字符串開頭和終止的空字符之間的字符數一樣長( 不包括終止的空字符本身 )。

由於您越界,您的代碼將調用未定義行為(UB)。 標准字符串函數(如printf() )依賴於NULL終止字符來標記字符串的結尾。 沒有它,他們不知道何時停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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