[英]Don't understand function to count digits in character array
我很難理解我教授對計算字符數組中位數的程序的解決方案。
int main(void)
{
char* s[] = {"12, 34, 56, 78",
"82.16, 41.296",
"2, -3, 5, -7, 11, -13, 17, -19",
"9.00009, 90.0009, 900.009, 9000.09, 90000.9"};
int i, rows = sizeof(s)/sizeof(s[0]);
for(i = 0; i < rows; i++) {
digitCounts( s[i] );
}
}
void digitCounts(char* s) {
int counts[10] = { 0 };
int i = 0;
while( s[i] != '\0' )
{
if('0' <= s[i] && s[i] <= '9')
counts[ s[i] - '0' ]++;
i++;
}
for(i = 0; i < 9; i++)
printf("%d, ", counts[i]);
printf("%d\n\n", counts[i]);
}
有人可以幫我理解這一節:
while( s[i] != '\0' )
{
if('0' <= s[i] && s[i] <= '9')
counts[ s[i] - '0' ]++;
i++;
}
我理解while循環條件:如果s [i]處的元素不等於NUL,則繼續。 但if語句讓我感到困惑,因為你在比較數值或字符串值嗎? 字符串值如何大於或小於另一個? 例如'1'<='9'。 另外,s []的第一個元素不是'12'嗎? 不是'1'。 換句話說,它不會是一個數字。
請幫助我真的迷路了!
這條線
if('0' <= s[i] && s[i] <= '9')
將單個字符串中的單個字符與字符常量 '0'
和'9'
(ASCII值48和57)進行比較。
請記住,在C語言的字符串是字符值后跟一個0值終止子的序列,和字符串由雙引號(分隔"
)。字符串(包括字符串常量)被存儲為陣列char
。的每個元素s
包含char
數組的第一個字符的地址,類似於以下1 :
+---+ +---+---+---+
s: | | ------> |'1'|'2'| 0 |
+---+ +---+---+---+
| | ----+
+---+ | +---+---+---+
| | -+ +-> |'3'|'4'| 0 |
+---+ | +---+---+---+
... |
| +---+---+---+
+----> |'5'|'6'| 0 |
+---+---+---+
因此, s[0]
指向字符串 "12"
, s[1]
指向字符串"34"
,等等。每個s[i]
被傳遞給digitCounts
函數,該函數逐字符遍歷字符串並檢查每一個都看看它是否是一個數字。
C語言定義保證數字字符 '0'
, '1'
, '2'
等的值是連續的,因此'0'
和'9'
之間'0'
任何字符值必須是數字字符。 所以條件
if ( '0' <= s[i] && s[i] <= '9' )
正在檢查每個s[i]
是否是一個數字字符(像'0'
和'9'
這樣'0'
字符常量由單引號分隔)。 請注意,有一個庫函數可以執行相同的操作,並且需要考慮區域設置的獎勵:
#include <ctype.h>
...
if ( isdigit( s[i] ) ) // does the same thing as the line above.
你教授的代碼......不是很棒。 如果他用不同的名字字符串數組中這本來是很好, main
(如numberStringList
)對輸入參數digitCounts
(如numberString
); 我認為這可以解釋你的一些困惑。 他應該告訴你如何使用isdigit
函數而不是手工黑客檢查。
main
, s
被聲明為指向char
( char *[]
)的指針數組。 數組的大小取自初始化列表中的初始值設定項的數量。 char
數組,但在大多數情況下,數組表達式被轉換(“衰減”)到指針表達式,而表達式的值是數組的第一個元素的地址。 所以每個s[i]
存儲字符串文字的地址 ,而不是文字本身。 while( s[i] != '\0' ) //while char at index i is not '\0' (end of string)
{
if('0' <= s[i] && s[i] <= '9') //if char at index i is between '0' and '9' (a digit)
counts[ s[i] - '0' ]++; // increase digit count. (counts is an array of size 10 where each index corresponds to digits 0-9
i++;
}
while( s[i] != '\0' ){
if('0' <= s[i] && s[i] <= '9')
counts[ s[i] - '0' ]++;
i++;
}
該循環迭代直到s[i]
等於'\\0'
。 然后比較字符,即'0'<=s[i]
,這兩個字符都不是字符串(基於ASCII值進行比較)。
然后,如果滿足條件,則在特定索引處的計數在數組counts
遞增。 如果s[i]
字符為'1'
則索引的計數加1。 這's[i]-'0'
,給出特定的整數為'1'-'0'
為1
作為它們的ASCII值之間的差值。
這些都是char
。
使用if
語句,您可以理解該字符是否為數字(不等式實際上是對每個char
的ASCII值起作用)。
這里char* s[]
表示二維字符數組或字符串數組 。 在digitCounts
,參數是char* s
,它是一維數組或字符串 。 這就是為什么, s[0]
或s[0]
的第一個元素將是'1',而不是'12'。
此外, '1' <= '9'
表示字符1和9的ASCII值比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.