-2

私のプログラム: 何かがおかしい

#define _CRT_SECURE_NO_WARNINGS
#include <ctype.h>
#include <stdio.h>
//Функция для проверки соответствия символов.
int ifSignsCorrect(char theChar) {
    if ((theChar >= 'A' && theChar <= 'Z') || (theChar >= 'a' && theChar <= 'z') || theChar == '.' || theChar == ' ' || theChar == '*') return 1;
    return 0;
}

int main() {
    char string[256];
    int i = 0;
    //Заполняем массив
    for (i = 0; i < 256; i++) {


        scanf("%c\n", &string[i]);
        if (string[i] == '*') break;
        printf("%с\n", string[i]);
        if (ifSignsCorrect(string[i]) != 1) {
            printf("You used wrong characer, formating disc C (Just joking)\n");
            return;
        }

    }


}
4

2 に答える 2

1

私が言及したい3つのこと:

初め:

次のコードで無効なメモリにアクセスしようとしています:

int i = 0;
while (string[i - 1] != '*') {

最初の反復では、 にアクセスしますstring[-1]。まずそれを解決しなければなりません。

2番:

この行でポインターの配列を定義しています。

char *string[256];

char string[256];代わりに文字の配列を使用してください。

三番:

次のように印刷できます。

printf("You used wrong characer, formating disc C (Just joking)\n");

この error_message を示す変数を定義したくない場合を除き、それはよりクリーンになる場合があります。特に、再利用することになります。

それが役に立てば幸い。

于 2013-09-07T18:47:36.830 に答える
1

ここでは、文字の配列の代わりにポインターの配列を使用しました。

 char *string[256];

ここでも範囲外の配列にアクセスしています。

while (string[i - 1] != '*') {    // here i == -1

また、次のような scanf() の後の if ステートメントも適切です。

if( string[i] == '*' )
    break ;

編集:

プログラムが文字のみを出力するのはなぜ?ですか? c行内の文字printf("%с\n", string[i]);は実際にはアスキーではないためc

ascii のみをサポートするプログラムにコピーしてみてください。それをメモ帳++にコピーし、エンコーディングをasciiに設定すると、?:)になりました。キリル文字が有効になっていることがわかりますので、多言語サポート エラーである必要があります。

于 2013-09-07T18:47:56.023 に答える