伊莉討論區
標題:
從字串裡如何抓數字???(已解決)
[打印本頁]
作者:
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
/// GetSumFromString Example
#include <stdio.h>
#define P printf /// for eyny only
int getSumFromString(const char *str)
{
if (!str) return 0; /// Return value to be discussed depends on application.
int sum = 0;
int num = 0;
while(*(str++) != '\0')
{
if(*str < '0' || *str > '9')
{
if(num > 0)
{
sum += num;
///P("sum + num (%d) = %d\n", num, sum);
num = 0;
}
continue;
}
num = num*10 + (*str - '0');
}
return sum;
}
int main(int argc , char **argv)
{
int x = 0;
x = getSumFromString("Cyut54is a356good 72school");
x += getSumFromString("Ne125ver 56give22 66up");
P("ANS= %d\n", x);
}
複製代碼
作者:
p12332145600
時間:
2011-3-27 11:29 AM
其實我的程度不是那麼好所以看不太懂那段副程式
不過我還是很感謝大大可以幫我解答 ^^
作者:
k85218693
時間:
2011-3-27 01:02 PM
下面應該是你需要的程式碼。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define fo fopen
#define pr printf
int main(void)
{
FILE *fptr = fo("input.txt", "r");
int sum = 0, c, n;
if(fptr != NULL)
{
do
{
c = getc(fptr);
if(isdigit(c))
{
ungetc(c, fptr);
fscanf(fptr, "%d", &n);
pr("%d", n);
sum += n;
}
else
{
pr("%c", c);
}
} while(!feof(fptr));
pr("\n");
pr("Ans=%d\n", sum);
}
else
{
pr("找不到檔案!\n");
exit(1);
}
fclose(fptr);
system("pause");
return 0;
}
複製代碼
作者:
p12332145600
時間:
2011-3-27 01:47 PM
ungetc(c, fptr); 這個指令不太清楚在做什麼
不過我知道這個指令 getc(fptr); 是從檔案讀取一個字元
作者:
ponchi96
時間:
2011-3-27 04:16 PM
回復
1#
p12332145600
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#define p printf
#define fo fopen
#define MAX 100
int num=0,y=0;
void a(int x)
{
if(x!=-1) //y用來判別陣列內的數 是 X*10^0,X*10^1,X*10^2 ...
num=num+(x*pow(10,y)),y++;
else
y=0;
}
int main()
{
int number[MAX],i;
char number2[MAX];
FILE *numberload=fo("input.txt","rt");
if(numberload == NULL)exit(1);
for(i=0;i<MAX;i++){
fscanf(numberload,"%c",&number2[i]);
if(number2[i]==NULL)break;
if(number2[i]>47&&number2[i]<58) //用ASCII碼判別為數字放進number2
number[i]=number2[i]-'0';
else
number[i]=-1; //若不是則放-1
p("%c",number2[i]);
}
fclose(numberload);
for(int j=i-1;j>=0;j--)//執行number2陣列計算總和
a(number[j]);
p("\nAns=%d\n",num);
system("pause");
return 0;
}
複製代碼
作者:
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 編輯
提供另一種版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define P printf
#define forever for(;;)
void keep_digit(char*s)
{
while(*s){
if(!isdigit(*s))
*s=' '; // 不是 '0'~'9' 的全部轉成空白
s++;
}
}
int main()
{
int sum=0,temp=0;
char s[100]={0};
char output[10000]={0};
char*p,*q;
while(fgets(s,sizeof(s),stdin)){
strcpy(output+strlen(output),s); // 將輸入字串 s 複製並接於 output 尾端
keep_digit(s); // 將字串中數字保留
p=s; // 將 p 指向 s 字串
forever{
temp=strtol(p,&q,10); // 抓取字串 p 中 10 進位數字,並將 q 指向該數字完結的後一個位置
if(p==q) // 字串中沒數字時 q 會指向 p,故可以此判斷
break;
sum+=temp;
p=q; // 將 p 移至 q
}
}
P("%s",output);
P("Ans=%d",sum);
getchar();
}
複製代碼
舉例與解說:
char s[7]=" 30 2 ";
char*p,*q;
p=s;
此時呈現以下關係:
s[0] ' ' <- p // 將 p 指向 &s[0]
s[1] '3'
s[2] '0'
s[3] ' '
s[4] '2'
s[5] ' '
s[6] '\0'
strtol(p,&q,10) 後,strtol 會回傳 p 指向字串(" 30 2 ")中第一個找到的 10 進位數字即 30,並將 q 指向該數字完結的後一個位置,此時呈現以下關係:
s[0] ' ' <- p // 將 p 指向 &s[0]
s[1] '3'
s[2] '0'
s[3] ' ' <- q // 將 q 指向 &s[3]
s[4] '2'
s[5] ' '
s[6] '\0'
此時 p!=q,故不會觸發 break 跳出迴圈,往下執行 p=q;,此時呈現以下關係:
s[0] ' '
s[1] '3'
s[2] '0'
s[3] ' ' <- q <- p // 將 p 指向 q,即 &s[3]
s[4] '2'
s[5] ' '
s[6] '\0'
第二次迴圈,strtol(p,&q,10) 會回傳 p 指向字串(" 2 ")中第一個找到的 10 進位數字即 2,並將 q 指向該數字完結的後一個位置,此時呈現以下關係:
s[0] ' '
s[1] '3'
s[2] '0'
s[3] ' ' <- p
s[4] '2'
s[5] ' ' <- q // 將 q 指向 &s[5]
s[6] '\0'
此時 p!=q,故不會觸發 break 跳出迴圈,往下執行 p=q;,此時呈現以下關係:
s[0] ' '
s[1] '3'
s[2] '0'
s[3] ' '
s[4] '2'
s[5] ' ' <- q <- p // 將 p 指向 q,即 &s[5]
s[6] '\0'
第三次迴圈,strtol(p,&q,10) 會回傳 p 指向字串(" ")中第一個找到的 10 進位數字,但因為該字串內已找不到任何 10 進位數字,故將 q 指向 p,此時呈現以下關係:
s[0] ' '
s[1] '3'
s[2] '0'
s[3] ' '
s[4] '2'
s[5] ' ' <- p <- q // 將 q 指向 p,即 &s[5]
s[6] '\0'
此時 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!