アプリ版:「スタンプのみでお礼する」機能のリリースについて

program SPROGRAM 17 4
pas104 SIDENTIFIER 43 4
( SLPAREN 33 4

上記のようなファイルを読みこんで、1行づつ各トークン(programとか17とか)を構造体に格納する関数reader()を作りましたが、これを以下のparser.cで呼びだすと「Segmentation fault(core dumped)」となってしまいます。gdbのrunコマンドでプログラムを実行すると、関数を呼び出す所で

Program received signal SIGSEGV, Segmentation fault.
0x0040140f in reader ()

と表示されました。が,どうすればよいか全然分かりません・・・
どうすれば正しく動作してくれるのか、どなたか教えてください・・・


以下ソース

/*read.c*/
#include "head.h"
void reader(void)
{
fprintf(stdout,"check");

char buf[BUF_LEN];

if (fgets(buf,sizeof(buf),fp) == NULL)/*ここで1行読みこむ*/
{/*いきなりNULLの場合*/

strcpy(t.str, "");
t.num = SEOF;
t.line = 1;

}

else
{

省略

}
return;
}






/*parser.c*/
#include "head.h"

struct tokenbox t;
FILE *fp;

int main(int argc, char *argv[])
{
if (argc != 2)/*引数チェック*/
{
fprintf(stderr,"Usage: (./parser) (file.ts)\n");
return -1;
}

int len;

len = strlen(argv[1]);/*file.ts の長さ取得*/

if((argv[1][len-1] == 's') && (argv[1][len-2] =='t') && (argv[1][len-3] == '.'))/*tsファイルが指定されているかどうか*/
{
fp = fopen(argv[1],"r");/*ファイルオープン*/
if (fp == NULL)
{
fprintf(stderr,"Such ts file is not exist\n");
return -1;
}

fprintf(stdout,"authenticate ts file!\n");//←これは出力される

reader(); //←ここでSegmentation faultと思われる

printf("t.str = %s\n", t.str);
printf("t.str[0] = %c\n", t.str[0]);
printf("t.num = %d\n", t.num);
printf("t.line = %d\n", t.line);

fclose(fp);
return 0;
}

else
{
fprintf(stderr,"the file is not ts\n");
return -1;
}
}






ヘッダファイル一部抜粋

/*head.h*/
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#define BUF_LEN 128
#define TOKEN_LEN 128

struct tokenbox
{/*tsファイルの各情報を格納する構造体*/
char str[TOKEN_LEN];
int num;
int line;
};
extern struct tokenbox t;/*構造体をtと置く*/
extern FILE *fp; /*ファイルポインタ*/

A 回答 (2件)

さらにヒントです。


C言語は完全ローカル変数です。main関数で設定されている変数は、あなたの作ったと思われるread.cでは何も引き出すことは出来ませんよ。

もう少し落ち着いて考えて下さい。
    • good
    • 0

gdbならreader()内のどこでSegmentation faultになったかわかるでしょう。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!