1

概念をテストするために小さな C プログラムを書いていますが、いくつか問題があります。まず、ここに私のコードのすべてがあります:

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

char one[] = "Figure A 200 200 =\0";
char two[] = "Figure B 300 200 =\0";

int main(void)
{
  char buffero[300];
  char buffert[300];
  memset(buffero, 0, sizeof(buffero));
  memset(buffert, 0, sizeof(buffert));

  int * doubleo = 0;
  int * doublet = 0;

  sscanf(one, "%s %s %d %d ",buffero, buffert, doubleo, doublet);
  printf("%s %s %d %d", buffero, buffert, *doubleo, *doublet);

  memset(buffero, 0, sizeof(buffero));
  memset(buffert, 0, sizeof(buffert));

  sscanf(two, "%s %s %d %d ", buffero, buffert, doubleo, doublet);
  printf("%s %s %d %d", buffero, buffert, *doubleo, *doublet);
};

私が実装しようとしたいくつかの修正で少し複雑になりましたが、それほどひどくはありません.

コンパイルはできますが、実行するとセグメンテーション違反が発生します。

GDB レポート:

#3  0x0000000000400683 in main () at mis_test.c:15
15    sscanf(one, "%s %s %d %d ",buffero, buffert, doubleo, doublet);

誰かがここで少し洞察を与えることができますか? 私はCにかなり慣れていませんが、それは非常に単純な問題であり、目の前にあることを知っていますが、理解できないようです。どんな助けでも大歓迎です。

4

3 に答える 3

6

これは、メモリを割り当てていないintポインタを使用しているためです。

 int * doubleo = 0;
 int * doublet = 0;

単純に2つの整数を使用できます。

 int doubleo = 0;
 int doublet = 0;

&次に、sscanfが整数へのポインタを期待しているので、sscanfを呼び出します。

  sscanf(one, "%s %s %d %d ",buffero, buffert, &doubleo, &doublet);

文字列を自分でnullで終了する必要はないことに注意してください。それはあなたのためにコンパイラによって行われます。

于 2012-10-31T21:52:46.453 に答える
0

フォーマット指定子%d sscanfの場合、タイプがの受信者オブジェクトを指すポインターが必要ですint。どこも指さないポインター(nullポインター)を指定しました。これがクラッシュの原因です。

明示的なポインターの使用を主張する場合は、最初に、それらが有効なintオブジェクトを指していることを確認する必要があります

int io, it;

int * doubleo = &io;
int * doublet = &it;

sscanfioデータをitオブジェクトに読み込みます

sscanf(one, "%s %s %d %d ", buffero, buffert, doubleo, doublet);

もちろん、ここではこれらの明示的なポインタは実際には必要ありません。あなたはただ完全doubleoに取り除くことができますdoublet

sscanf(one, "%s %s %d %d ", buffero, buffert, &io, &it);
于 2012-10-31T21:54:45.370 に答える
0

これを試して :

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

char one[] = "Figure A 200 200 =\0";
char two[] = "Figure B 300 200 =\0";

int main(void)
{
   char buffero[300];
   char buffert[300];
   memset(buffero, 0, sizeof(buffero));
   memset(buffert, 0, sizeof(buffert));

   int doubleo = 0;
   int doublet = 0;

   sscanf(one, "%s %s %d %d ",buffero, buffert, &doubleo, &doublet);
   printf("%s %s %d %d", buffero, buffert, doubleo, doublet);

   memset(buffero, 0, sizeof(buffero));
   memset(buffert, 0, sizeof(buffert));

   sscanf(two, "%s %s %d %d ", buffero, buffert, &doubleo, &doublet);
   printf("%s %s %d %d", buffero, buffert, doubleo, doublet);
};

または、*doubleoと*doubletにメモリを割り当てます

于 2012-10-31T21:57:01.753 に答える