0

誰かがよく説明された例を挙げてくれることを本当に願っています。どこでも検索していますが、適切な解決策が見つかりません。

私は C プログラミング クラスの紹介を受けています。最後の課題は、10 桁の ISBN をダッシュ​​で検証するプログラムを作成することです... ISBN は文字列として CHAR 配列に入力されます。そこから、ISBN の有効性を計算できるように、各桁を区切って整数に変換する必要があります。その上、ダッシュは無視する必要があります..

私の考えたプロセスは、INT 配列を作成し、ループを使用して各文字を配列に格納し、atoi() 関数を介して渡すことでした。また、IF ステートメントを使用して、CHAR 配列の各部分をチェックし、ダッシュが見つかったかどうかを確認してみました。見つかった場合は、配列内の次のスポットにスキップします。それは次のように見えました:

int num[12], i = 0, j = 0, count = 0;
char isbn[12];

    printf ("Enter an ISBN to validate: ");
    scanf ("%13[0-9Xx-]%*c", &isbn);

 do {
        if (isbn[i] == '-') {
            i++;
            j++;
        }
        else {
            num[i]= atoi(isbn[j]);
            i++;
            j++;
        }
        count++;
    } while (count != 10);

しかし、それによってセグメンテーション違反が発生するため、IF ステートメントが実際にダッシュをフィルター処理したかどうかさえわかりません....

誰かがこれを試して解決できれば、本当に感謝しています。課題は12月4日の予定でしたが、12月7日まで延長されたので、時間に追われています。

説明にコードを書き込んでください。私は視覚学習者であり、段階的に見る必要があります。

コーディングする必要があることは明らかですが、この障害を乗り越えるまで先に進むことはできません。

前もって感謝します!

4

1 に答える 1

0

まず第一に、あなたの定義はisbn13文字を保持するのに十分ではありません。したがって、14文字の長さにする必要があります(終了も保存するため'\0')。

次に、ループが非常に複雑です。同じ値を維持する3つのループ変数は冗長です。

第3に、文字列は1文字ほどの短さである可能性があるため、ループは安全ではありませんが、コードは10回ループします。

最後に、数字のASCII値を保持する文字の変換は、それから減算するだけで変換できます'0'

これは、上記の改善が行われた後のコードです。

#include <stdio.h>

int main(void)
{
    int num[14], i;
    char isbn[14], *p;

    printf("Enter an ISBN to validate: ");
    scanf("%13[0-9Xx-]%*c", &isbn);

    // p iterates over each character of isbn
    // *p evaluates the value of each character
    // the loop stops when the end-of-string is reached, i.e. '\0'
    for (p = isbn, i = 0; *p; ++p) {
        if (*p == '-' || *p == 'X' || *p == 'x') {
            continue;
        }
        // it's definitely a digit now
        num[i++] = *p - '0';
    }

    // post: i holds number of digits in num
    // post: num[x] is the digit value, for 0 <= x < i

    return 0;
}
于 2012-12-06T03:23:51.313 に答える