sizeof和strlen在C語言中常用來計算字元大小和長度,在應用中卻有著本質的區別。 sizeof是C語言中的關鍵字,其作用是返回一個對象或類型所占的記憶體位元組數。使用方式為: int i; sizeof(int); *//值為4*` sizeof(i); *//值為4,等價於sizeof(int ...
sizeof和strlen在C語言中常用來計算字元大小和長度,在應用中卻有著本質的區別。
sizeof是C語言中的關鍵字,其作用是返回一個對象或類型所占的記憶體位元組數。使用方式為:
int i; sizeof(int); *//值為4*` sizeof(i); *//值為4,等價於sizeof(int)* sizeof(2); *//值為4,等價於sizeof(int),因為2的類型為int* sizeof(2 + 3.14); *//值為8,等價於sizeof(double),因為此表達式的結果的類型為double*
strlen() 函數從字元串的開頭位置依次向後計數,直到遇見\0
,然後返回計時器的值。最終統計的字元串長度不包括\0
。使用方式為:
char str[30] = "abc defg"; // printf("strlen(str) = %d \n", strlen(str)); // 帶上空格總共8字元
上述為sizeof關鍵字和strlen函數的基本用法,在實際應用或面試中,應多註意兩者區別:
1、sizeof關鍵字在編譯時期就已經確定,stelen函數在運行時期確定。
int a = 1; printf("%d", sizeof(a++)); printf("%d", a);
上述代碼運行結果為4,1。因為sizeof是關鍵字,所以在第一行輸出時a++不會運行,括弧內的參數並不會參與計算。這也正證實sizeof關鍵字在編譯時期已經確定,系統認為是常數。
其實上述代碼也可作為分辨關鍵字和函數的區別,當然用指針取址的方法也可分別關鍵字和函數的區別。
int b = 10; void* a = &sizeof(b);
這行代碼會運行錯誤,如果sizeof為函數,則指針可指向sizeof的地址,但因為是關鍵字,取址會導致編譯錯誤。
2、sizeof和strlen的結束符占有大小不同。
sizeof("\0") = 2; strlen("\0") = 0;
strlen是計算字元串的長度,在C/C++中字元串以“\0”結尾。
sizeof計算操作數的存儲大小,“\0”占兩位元組。
3、strlen返回值為size_t,為無符號整型。
char a[10] = "abcd"; char b[10] = "a"; if (strlen(b) - strlen(a) > 0) { printf("字元串b 比 字元串a 長 \n"); } else { printf("字元串a 比 字元串b 長 \n"); }
上述代表運行結果為“字元串b比 字元串a 長 ”,導致這個輸出結果的原因為size_t為無符號整型,所以strlen(b)結果為大於0的數,strlen(a)結果為大於0的數,兩個size_t相減也為size_t類型,結果也一定大於0.
4、strlen()定義字元串數組時,一定要初始化。
char test[50]; // 未初始化 printf(" test[] = "); for (int i = 0; i < 26; i++) { test[i] = 'A' + i; printf(" %c ", test[i]); } printf("\n stelen(test) = %d \r\n", strlen(test));
上述看到strlen計算出的結果是77,顯示是錯誤的
原因:test字元串在定義時未初始化,test字元串在定義時,拿到一片記憶體,此時這片記憶體裡面可能儲存有值,導致使用strlen計算test字元串時找不到字元串結束標誌 ’\0‘,而會在test申請的那片記憶體後面一直找下去,找到 ’\0‘ 後輸出,計算的結果,此時輸出的結果肯定錯誤的結果。
以上為網上資料和個人的一些理解,如有錯誤,請指正。
資料出處
https://blog.csdn.net/qq_45809384/article/details/124705939
https://blog.csdn.net/u013812502/article/details/81198452