[英]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.