簡體   English   中英

不懂函數來計算字符數組中的數字

[英]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函數而不是手工黑客檢查。


  1. mains被聲明為指向charchar *[] )的指針數組。 數組的大小取自初始化列表中的初始值設定項的數量。

    初始化程序中的每個字符串文字也是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.

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