[英]strcmp in C returns 1 instead of 0
我用C語言編寫了以下代碼。
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[4] = "abcd";
char str2[4] = "abcd";
printf("%d\n",strcmp(str1,str2));
return 0;
}
我期望返回值為0(因為有人告訴我strcmp函數對於相等的字符串返回0)。 但它打印1!
Success time: 0 memory: 2248 signal:0
1
是蟲子嗎? 還是我錯過了什么?
因為您的數組不夠長。 您沒有考慮字符串的零終止符。 您的字符串需要5個字符,字符串本身需要4個字符,零終止符需要1個字符。
寫:
char str1[5] = "abcd";
char str2[5] = "abcd";
順便說一句,我想知道為什么您的編譯器不發出警告還是發出警告?
您的一個字符串在內存中看起來像這樣:'a''b''c''d''\\ 0'。 也就是說,像每個字符串一樣,它以“ \\ 0”結尾,該字符就像“ a”或“ b”一樣。 因此,為了存儲字符串“ abcd”,您需要五個字符的空間,並且必須通過char str1 [5]對其進行聲明。
為數組提供正確的大小,或者讓編譯器為您做所有事情
char str1[] = "abcd";
char str2[] = "abcd";
在這種情況下,編譯器將為您的字符串提供足夠的空間。
(由Pascal Cuoq提供)
C99標准§6.7.8.¶14說
字符類型的數組可以由字符串文字初始化,並可選地用大括號括起來。 字符串文字的連續字符(如果有空間或數組大小未知,則包括終止空字符)將初始化數組的元素。
由於字符串以空字節'\\0'
終止,因此字符串文字"abcd"
的實際字符數為5
。 數組str1
和str2
的大小為4
。 因此,它們不能保存空字節,並且實際上不是字符串。 以下陳述是等效的。
char str1[4] = "abcd";
char str1[4] = {"abcd"}
char str1[4] = {'a', 'b', 'c', 'd'};
將str1
和str2
傳遞給strcmp
調用未定義的行為,因為它們不是字符串。 strcmp
無法找到終止的空字節,因此它將溢出str1
和str2
str1
的緩沖區。 這是未定義的行為,並可能由於段錯誤而導致程序崩潰。
字符串是一個以空字節'\\0'
結尾的字符數組。 因此,字符串文字"abcd"
的長度為5
而不是4
。 請注意,標准庫函數strlen
不計算空字節,因此在這種情況下, strlen("abcd")
返回4
。
使用字符串文字初始化數組時,最好將數組大小留為空白,該大小會自動確定為足以將所有字符存儲在使用其初始化的字符串文字中。
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[] = "abcd";
char str2[] = "abcd";
printf("%d\n", strcmp(str1, str2)); // prints 0
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.