伊莉討論區

標題: 從字串裡如何抓數字???(已解決) [打印本頁]

作者: p12332145600    時間: 2011-3-27 09:51 AM     標題: 從字串裡如何抓數字???(已解決)

本帖最後由 p12332145600 於 2011-3-28 07:41 AM 編輯

從字串裡如何抓數字

範例輸入:
Cyut54is a356good 72school
Ne125ver 56give22 66up

範例輸出:
Cyut54is a356good 72school
Ne125ver 56give22 66up
Ans=751

計算方法:54+356+72+125+56+22+66=751

請大大可以幫忙一下!!
作者: yp7346    時間: 2011-3-27 11:04 AM

  1. /// GetSumFromString Example
  2. #include <stdio.h>
  3. #define P printf /// for eyny only

  4. int getSumFromString(const char *str)
  5. {
  6.         if (!str) return 0; /// Return value to be discussed depends on application.

  7.         int sum = 0;
  8.         int num = 0;
  9.         while(*(str++) != '\0')
  10.         {
  11.                 if(*str < '0' || *str > '9')
  12.                 {
  13.                         if(num > 0)
  14.                         {                 
  15.                                 sum += num;
  16.                                 ///P("sum + num (%d) = %d\n", num, sum);
  17.                                 num = 0;
  18.                         }        
  19.                         continue;
  20.                 }
  21.                
  22.                 num = num*10 + (*str - '0');        
  23.         }

  24.         return sum;
  25. }

  26. int main(int argc , char **argv)
  27. {

  28.         int x = 0;
  29.         
  30.         x  = getSumFromString("Cyut54is a356good 72school");
  31.         x += getSumFromString("Ne125ver 56give22 66up");
  32.         
  33.         P("ANS= %d\n", x);
  34. }
複製代碼

作者: p12332145600    時間: 2011-3-27 11:29 AM

其實我的程度不是那麼好所以看不太懂那段副程式
不過我還是很感謝大大可以幫我解答  ^^
作者: k85218693    時間: 2011-3-27 01:02 PM

下面應該是你需要的程式碼。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #define fo fopen
  5. #define pr printf

  6. int main(void)
  7. {
  8.     FILE *fptr = fo("input.txt", "r");
  9.     int sum = 0, c, n;
  10.    
  11.     if(fptr != NULL)
  12.     {
  13.         do
  14.         {
  15.             c = getc(fptr);
  16.             
  17.             if(isdigit(c))
  18.             {
  19.                 ungetc(c, fptr);
  20.                 fscanf(fptr, "%d", &n);
  21.                 pr("%d", n);
  22.                 sum += n;
  23.             }
  24.             else
  25.             {
  26.                 pr("%c", c);
  27.             }
  28.         } while(!feof(fptr));
  29.         pr("\n");
  30.         pr("Ans=%d\n", sum);
  31.     }
  32.     else
  33.     {
  34.         pr("找不到檔案!\n");
  35.         exit(1);
  36.     }
  37.     fclose(fptr);
  38.     system("pause");
  39.     return 0;
  40. }
複製代碼

作者: p12332145600    時間: 2011-3-27 01:47 PM

ungetc(c, fptr); 這個指令不太清楚在做什麼
不過我知道這個指令  getc(fptr);    是從檔案讀取一個字元
作者: ponchi96    時間: 2011-3-27 04:16 PM

回復 1# p12332145600
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<math.h>  
  4. #define p printf
  5. #define fo fopen
  6. #define MAX 100

  7. int num=0,y=0;
  8. void a(int x)
  9. {
  10.    if(x!=-1)   //y用來判別陣列內的數 是 X*10^0,X*10^1,X*10^2 ...
  11.       num=num+(x*pow(10,y)),y++;
  12.    else
  13.       y=0;  
  14. }  
  15. int main()
  16. {
  17.    int number[MAX],i;
  18.    char number2[MAX];
  19.    FILE *numberload=fo("input.txt","rt");
  20.    if(numberload == NULL)exit(1);
  21.    for(i=0;i<MAX;i++){  
  22.         fscanf(numberload,"%c",&number2[i]);
  23.         if(number2[i]==NULL)break;
  24.         if(number2[i]>47&&number2[i]<58) //用ASCII碼判別為數字放進number2
  25.            number[i]=number2[i]-'0';
  26.         else
  27.            number[i]=-1;                 //若不是則放-1
  28.         p("%c",number2[i]);      
  29.    }     
  30.    fclose(numberload);
  31.    for(int j=i-1;j>=0;j--)//執行number2陣列計算總和
  32.      a(number[j]);
  33.    p("\nAns=%d\n",num);  
  34.    system("pause");
  35.    return 0;                  
  36. }
複製代碼

作者: p12332145600    時間: 2011-3-27 05:10 PM

回復 6# ponchi96

謝謝大大幫我解答!!!!  感恩  ^^
作者: k85218693    時間: 2011-3-30 08:09 PM

回復 5# p12332145600
ungetc(c, fptr);
是把變數c裝的字元,還回fptr的檔案內。
簡單的說,就是倒退一格。
還有,程檢加油
作者: p12332145600    時間: 2011-3-30 08:24 PM

回復 8# k85218693
謝謝大大讓我學到新的語法
我一定會加油的!!
作者: tony01111299    時間: 2011-3-31 12:56 AM

本帖最後由 tony01111299 於 2011-3-31 01:19 AM 編輯

提供另一種版本:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #define P printf
  6. #define forever for(;;)
  7. void keep_digit(char*s)
  8. {
  9.      while(*s){
  10.           if(!isdigit(*s))
  11.                *s=' '; // 不是 '0'~'9' 的全部轉成空白
  12.           s++;
  13.           }
  14. }
  15. int main()
  16. {
  17.      int sum=0,temp=0;
  18.      char s[100]={0};
  19.      char output[10000]={0};
  20.      char*p,*q;
  21.      while(fgets(s,sizeof(s),stdin)){
  22.           strcpy(output+strlen(output),s); // 將輸入字串 s 複製並接於 output 尾端
  23.           keep_digit(s); // 將字串中數字保留
  24.           p=s; // 將 p 指向 s 字串
  25.           forever{
  26.                temp=strtol(p,&q,10); // 抓取字串 p 中 10 進位數字,並將 q 指向該數字完結的後一個位置
  27.                if(p==q) // 字串中沒數字時 q 會指向 p,故可以此判斷
  28.                     break;
  29.                sum+=temp;
  30.                p=q; // 將 p 移至 q
  31.                }
  32.           }
  33.      P("%s",output);
  34.      P("Ans=%d",sum);
  35.      getchar();
  36. }
複製代碼
舉例與解說:
  1. char s[7]=" 30 2 ";
  2. char*p,*q;
  3. p=s;

  4. 此時呈現以下關係:

  5. s[0]  ' '  <- p // 將 p 指向 &s[0]
  6. s[1]  '3'
  7. s[2]  '0'
  8. s[3]  ' '
  9. s[4]  '2'
  10. s[5]  ' '
  11. s[6]  '\0'

  12. strtol(p,&q,10) 後,strtol 會回傳 p 指向字串(" 30 2 ")中第一個找到的 10 進位數字即 30,並將 q 指向該數字完結的後一個位置,此時呈現以下關係:

  13. s[0]  ' '  <- p // 將 p 指向 &s[0]
  14. s[1]  '3'
  15. s[2]  '0'
  16. s[3]  ' '  <- q // 將 q 指向 &s[3]
  17. s[4]  '2'
  18. s[5]  ' '
  19. s[6]  '\0'

  20. 此時 p!=q,故不會觸發 break 跳出迴圈,往下執行 p=q;,此時呈現以下關係:

  21. s[0]  ' '
  22. s[1]  '3'
  23. s[2]  '0'
  24. s[3]  ' '  <- q <- p // 將 p 指向 q,即 &s[3]
  25. s[4]  '2'
  26. s[5]  ' '
  27. s[6]  '\0'

  28. 第二次迴圈,strtol(p,&q,10) 會回傳 p 指向字串(" 2 ")中第一個找到的 10 進位數字即 2,並將 q 指向該數字完結的後一個位置,此時呈現以下關係:

  29. s[0]  ' '
  30. s[1]  '3'
  31. s[2]  '0'
  32. s[3]  ' '  <- p
  33. s[4]  '2'
  34. s[5]  ' '  <- q // 將 q 指向 &s[5]
  35. s[6]  '\0'

  36. 此時 p!=q,故不會觸發 break 跳出迴圈,往下執行 p=q;,此時呈現以下關係:

  37. s[0]  ' '
  38. s[1]  '3'
  39. s[2]  '0'
  40. s[3]  ' '
  41. s[4]  '2'
  42. s[5]  ' '  <- q <- p // 將 p 指向 q,即 &s[5]
  43. s[6]  '\0'

  44. 第三次迴圈,strtol(p,&q,10) 會回傳 p 指向字串(" ")中第一個找到的 10 進位數字,但因為該字串內已找不到任何 10 進位數字,故將 q 指向 p,此時呈現以下關係:

  45. s[0]  ' '
  46. s[1]  '3'
  47. s[2]  '0'
  48. s[3]  ' '
  49. s[4]  '2'
  50. s[5]  ' '  <- p <- q // 將 q 指向 p,即 &s[5]
  51. s[6]  '\0'

  52. 此時 p==q,觸發 break 跳出迴圈。
複製代碼

作者: p12332145600    時間: 2011-4-1 07:51 AM

回復 10# tony01111299

感謝大大可以提供另一種解法!!
還加上解說(感恩!!)
作者: BerserkRick    時間: 2011-4-4 09:09 PM

題目超像一個地方出來的...
樓主加加油...

作者: toootoootw    時間: 2011-4-6 12:56 AM

提示: 作者被禁止或刪除 內容自動屏蔽




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!