2017-01-14 80 views
1

私は初心者であり、私の英語はあまり良くありません。私は文字列内の数値を集計しようとしています(a14fg5pk145の場合、14 + 5 + 145を返します)、それが機能しません。 "例外がスローされました:読み取りアクセス違反 strが0x61でした。例外がスローされました:読み取りアクセス違反

この私に私のコード:機能SumStr

void main() 
{ 
    int x, i; 
    char* pp; 
    char buffer[SIZE]; 
    printf("Please enter numbers and letters:\n"); 
    gets(buffer); 
    pp = buffer; 
    x = SumStr(*pp); 
    printf("%d", x); 
} 

int SumStr(char* str) 
{ 
    int sum=0, num=0, flag = 0; 
    while ((*str) != '\0') 
    { 
     while (((*str) > '1') && ((*str) < '9')) 
     { 
      if (flag == 0) 
      { 
       num += (*str); 
       flag = 1; 
      } 
      else if (flag == 1) 
       num = num * 10 + (*str); 
      str++; 
     } 
     if (flag == 0) 
      str++; 
     sum += num; 
     num = 0; 
     flag = 0; 
    } 
    return sum; 
} 
+1

もう一つのアドバイス: '((* STR)> '1')&&((* STR)< '9') 'は' isdigit(* str) 'です。標準的なライブラリを使用して、ホイールを再発明しないでください。 – DyZ

+1

番号にゼロを入れないでください。実際には、あなたは '0'、' 1'、 '9'を除外しています。これは珍しいことです。 –

+0

SOはデバッグサービスではありません。シンボルでコンパイルするには、デバッガ内でコードを実行し、プログラムを1行ずつトレースして、関連する変数の値を調べ、実際に何が起こっているのかを調べます。 *具体的な質問が発生した場合は、ここに戻って自由に感じてください。 – alk

答えて

0

パスpp、ない*pp、。 *ppのタイプはcharであり、関数の期待値はchar *です。実際には、ppはまったく必要なく、bufferをパラメータとして渡すだけです。また

Never use gets()。 のデータをあらかじめ知っていないと読み込むことができないため、 gets()はバッファの末尾を超えて文字を格納し続けるため、使用することは非常に危険です。これは、コンピュータ のセキュリティを壊すために使用されています。代わりにfgets()を使用してください。

+0

私はそれを確認しますagaing、ありがとう! – Jovani

+1

コードは完全なプロトタイプで使用される前に 'SumStr()'を宣言するか、 'main()'の前にその定義を移動してコンパイラが関数の誤用を発見できるようにする必要があります。それが立てば、その手は結ばれています。トラブルを報告することはできません。 –

2

例外を引き起こしているコードの最初の問題。

x = SumStr(*pp); 

あなたがアスタリスクを取り付けることにより、文字列ポインタではないその最初の文字のアドレスを渡す必要があるため、それは

x = SumStr(pp); 

でなければなりません。

それをうまく動作させない第2弾です。

num += (*str); 

と(* STR)あなたが実際に番号の代わりに文字のASCII値を追加することにより、

num = num * 10 + (*str); 

。 これは、ascii値をnumberに変更することで問題を解決します。

num += (*str) - '0'; 

num = num * 10 + (*str) - '0'; 
+0

私の数字に0カウント、私はそれを忘れてしまった...あなたの答えをありがとう! – Jovani

2

これは

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
    int i, sum = 0, store; 
    char str[] = "a14fg5pk145asdasdad6"; 
    int length = strlen(str); 
    for(i = 0; i < length; i++) { 
     store = 0; 
     while(isdigit(str[i])) { 
      store = (store * 10) + (str[i] - '0'); 
      i++; 
     } 
     sum += store; 
    } 
    printf("%d\n", sum); 
    return 0; 
} 

出力あなたの目的を果たすことがあります。

170 
関連する問題