1

私はcodechef(A4)に関する質問のためにこのコードを書きました...入力を与えると:2 4 2

このプログラムは、それ以上の入力を行わずに予期せず停止します....コードの間違いを指摘してもらえますか?

#include <stdio.h>
#include<math.h>
void number(long int a,int b)
{
    int c;
    c=b;
    int first[c],last[c],e=1,i;
    long int d;
    d=pow(a,a);
    for(i=(c-1);i>=0;i--)
    {
     last[i]=fmod(d,pow(10,e));
     e++;
    }
    e=1;
    while(d>pow(10,(b-1)))
        d/=10;

    for(i=(c-1);i>=0;i--)
    {
        first[i]=fmod(d,pow(10,e));
        e++;
    }

    for(i=0;i<c;i++)
        printf("%d",first[i]);
    printf(" ");
    for(i=0;i<c;i++)
        printf("%d",last[i]);
    printf("\n");

}
int main()
{ int T;
  scanf("%d",&T);
  while(T--)
  {   long int a;
      int b;
      scanf("%ld %d",a,b);
      number(a,b);
  }

    return 0;
}
4

3 に答える 3

5
scanf("%ld %d",&a,&b);

初期化されていない変数を使用すると、UB が発生します。と を使用&a&bて変数をスキャンする必要があります

于 2015-01-08T16:11:00.760 に答える
2

あなたのコードでは

scanf("&ld %d",a,b);

これは、a と b の値のメモリ位置に整数を入力しようとしていることを意味します。たとえば、a = 1234566466 (long int)、および b = 1234 (int) の値を設定します。したがって、1234 は RAM の先頭にあるメモリ位置です。その領域にシステム ファイルがロードされます。したがって、システムの動作を変更します。それは許されません。

さらに、コンパイラがプログラムにメモリ空間を割り当てると、メモリセグメント内にあるメモリにのみ直接アクセスできます。しかし、上記のステートメントは別のセグメントにアクセスしようとしています。

そのため、セグメンテーション違反が発生します。

于 2015-01-08T17:26:03.200 に答える
1

ポインタを期待する関数に整数を渡しています.scanf"%d"指定子"%ld"はそれぞれ と を期待int *しておりlong int *、 と を渡しintlong intいるため、メモリアドレスであるかのように整数にアクセスしようとすると がsegmentation fault発生します.

正しい呼び出し方scanfは、Gopiが言ったとおりです。

scanf("%ld %d", &a, &b);

そこでは、値の代わりにaとアドレスを渡します。b

于 2015-01-08T16:23:38.297 に答える