1

USACOの問題を解決しています。この問題では、2つの文字列を入力として受け取り、47を法とする数値を計算する必要があります。値が同じ場合はGOが出力され、そうでない場合はSTAYが出力されます。最初の数値はアルファベットの数値(Aの場合は1、Zの場合は同様に26)の積をとって計算され、最後の数値はモジュロを使用して計算されます。

私のプログラムはエラーなしでコンパイルされており、私のコンピューターで正常に実行されています。ただし、グレーダーコンピュータによる実行エラーとしてセグメンテーション違反が表示されています。プログラムと出力は次のとおりです。-

プログラム:-

#include<stdio.h>
#include<string.h>
main()
{
    int cal(char *ptr);
    char *comet,*group;
    int a,b;
    scanf("%s",comet);
    a=cal(comet);
    scanf("%s",group);
    b=cal(group);
    if(a==b)
        printf("GO");
    else
        printf("STAY");
    return 0;
}
int cal(char *ptr)
{
    int i=0,c,prod=1,mod;
    while(ptr[i]!='\0')
        {
            if(ptr[i]>='A'&&ptr[i]<='Z')
            {
                c=ptr[i]-'@';
                prod=prod*c;
                i++;
            }
        }
    mod=prod%47;
    return mod;
}

出力:-

ここに画像の説明を入力してください

私の質問は、セグメンテーション違反を特定する方法です。私はこの障害について読みましたが、このプログラムで何をすべきかわかりません。どんな助けでも素晴らしいでしょう。

4

5 に答える 5

1
char *comet,*group;
int a,b;
scanf("%s",comet);

cometポインタが初期化されていません。メモリを割り当てる必要がありcomet、この割り当てられたメモリにポイントを作成します。そうしないscanfと、ランダムな場所にバイトが書き込まれ、システムがクラッシュする可能性があります。

于 2013-02-02T01:22:55.370 に答える
1

あなたwhileは非常に疑わしいです:が大文字のi場合にのみ増加します。ptr[i]そうでない場合はどうすればよいですか?大文字のみが表示されるという鉄壁の保証がある場合は、次のように記述できます。

prod = 1;
while(*ptr) {
  prod *= *ptr - 'A' + 1;
  ptr++;
}

( ptr[i] - '@'ascii(7) が発生するまで頭を悩ませていました。私のバージョンの方が明確であり、中途半端なコンパイラでも同じコードが得られると思います。) または、より慣用的に:

int cal(char *ptr)
{
    int prod = 1;

    while(*ptr)
       prod *= *ptr++ - 'A' + 1;
    return prod % 47;
}

積がオーバーフローしないように注意してください。おそらく、各文字のモジュラスを実行してください。

int cal(char *ptr)
{
    int prod = 1;

    while(*ptr) {
       prod *= *ptr++ - 'A' + 1;
       prod %= 47;
    }
    return prod;
}
于 2013-02-02T01:51:17.677 に答える
0

「私のコンピューターでうまく実行されています」これは、コンパイラー固有のコード (turbo c の getch など) を使用していないため、この場合は不可能です。

文字列を格納するためのメモリを割り当てませんでした。ポインター comet と group は何も指していません。scanf は入力を書き込むためのアドレスを必要としますが、ポインターにはアドレスが含まれていないため、セグメンテーション違反が発生しています。malloc (または calloc) を使用してメモリを割り当てるか、文字配列を定義できます。

修正したコードは

#include<stdio.h>
#include<string.h>
#define MAXLENGTH 100
int main()
{
    int cal(char *ptr);
    char comet[MAXLENGTH],group[MAXLENGTH];
    int a,b;
    scanf("%s",comet);
    a=cal(comet);
    scanf("%s",group);
    b=cal(group);
    if(a==b)
        printf("GO");
    else
        printf("STAY");
    return 0;
}
int cal(char *ptr)
{
    int i=0,c,prod=1,mod;
    while(ptr[i]!='\0')
    {
        if(ptr[i]>='A'&&ptr[i]<='Z')
        {
            c=ptr[i]-'@';
            prod=prod*c;
            i++;
        }
    }
    mod=prod%47;
    return mod;
}
于 2013-02-02T02:05:17.430 に答える