質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Q&A

解決済

1回答

915閲覧

windowsでは問題ないのですがMac OSでAbort trao:6のエラーメッセージがでます。どの領域が足りないのか教えて頂いたいです。

settua

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

0グッド

0クリップ

投稿2018/08/01 11:13

前提・実現したいこと

C言語で,字句解析プログラムを作成したいのですが,

発生している問題・エラーメッセージ

エラーメッセージがでます。領域改善するのは大体わかるのですが,具体的にどこをどのように直すべきか教えて頂きたいです。

###エラーメッセージ
Abort trao:6

##該当のソースコード

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

#define STR_MAX 256 /* 1行の最大長 */

/* グローバル変数 /
char gt_line[STR_MAX]; /
get_token()用の1行データバッファ /
char token[STR_MAX]; /
取得トークン */

//予約語

char *pre[]={
"void",
"char",
"short",
"int",
"long",
"float",
"double",
"auto",
"static",
"const",
"signed",
"unsigned",
"extern",
"volatile",
"register",
"return",
"goto",
"if",
"else",
"switch",
"case",
"default",
"break",
"for",
"while",
"do",
"continue",
"typedef",
"struct",
"enum",
"union",
"sizeof",
"printf",
"scanf",
"sprintf",
"gets",
"puts",

};

/* プロトタイプ宣言 */
char get_token(void); / トークン取りだし */

void jiku(char *); //字句解析関数

char *get_token(void)
{
char *p, *ptk, ch;

p = gt_line; /* ポインタの初期化 */ ptk = token; /* ポインタの初期化 */ while(*p == ' ' || *p == '\t') /* 空白を読み飛ばす */ ++p; if(*p == '\0'){ /* バッファが空 */ token[0] = '\0'; return(token); }

if(isalpha(*p)){
do{
*ptk++ = *p++;
}while(isalnum(*p) && p !='\0'); / 2文字目以降は英数字 /
/
----- 数字 ----- */
}else if(isdigit(*p)){
do{
*ptk++ = *p++;
}while((isdigit(*p) || *p == '.' || toupper(*p) == 'E') && p !='\0');
/
----- 文字・文字列定数 ----- */
}else if(*p == ''' || *p == '"'){
ch = *p;
*ptk++ = *p++;
do{
if(p == ''){ / エスケープ文字 */
*ptk++ = *p++;
*ptk++ = *p++;
}else if(p != '\n') / 改行コード無視 */
*ptk++ = *p++;
}while(p != ch);
++p;
/
----- その他の文字 ----- */
}else
*ptk++ = *p++;
ptk = '\0'; / 文字列終端 /
strcpy(gt_line, p); /
残りの文字列をバッファにコピー */
return(token);
}

//字句解析関数
void jiku(char *token){
int i;

//予約語判定 i=0; while(pre[i]!='\0'){ if(!strcmp(token,pre[i])){ puts("予約語"); /*このままだとさらに名前判定に引っかかるため、 goto文を用いて判定部分の最後まで飛ばす。*/ goto end; } i++; } //演算子判定 if(*token=='+'||*token=='-'||*token=='*'|| *token=='/'||*token=='%'||*token=='<'|| *token=='>'||*token=='<'||*token=='=') puts("演算子"); //区切り子判定 else if(*token=='['||*token==']'||*token=='('|| *token==')'||*token=='{'||*token=='}'|| *token==','||*token==':'||*token==';'|| *token=='='||*token=='#'||*token=='.'|| *token=='\n'||*token=='"') puts("区切り子"); else {//それ以外は数字か名前として処理 if(isdigit(*token)) puts("名前(数字)"); else puts("名前"); } end:;

}

int main(void)
{

FILE *bf; char file[80]; /* ファイル名 */ printf("ファイル名 : "); /* プロンプト表示 */ gets(file); /* ファイル名入力 */ if((bf = fopen(file, "r")) == NULL){ /* ファイルオープン */ printf("ファイルがオープンできない\n"); exit(1); /* 強制終了 */ } puts(""); while(fgets(gt_line, STR_MAX, bf) != NULL){ /* 1行読み込み */ while(1){ get_token(); if(*token == '\0') /* 1行分終了 */ break; if(*token == '\n') printf("(\n)"); /* 改行コード */ else printf("%s ", token); /* 表示 */ //ここで解析を行う jiku(token); } } fclose(bf); /* ファイルクローズ */

}

補足情報(FW/ツールのバージョンなど)

CotEditord,ターミナル使用です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C

1strcpy(gt_line, p); /* 残りの文字列をバッファにコピー */ 2

pはgt_lineを走査しているポインタなので、strcpyに与えるコピー先とコピー元の
メモリが重なっています。重なっている場合strcpyの動作は保証されません。
実際そこで死んじゃっているようです。
Windowsで動いているのはたまたまです。

保証されているmemmoveにすれば動くようです。

C

1memmove(gt_line, p, strlen(p) + 1); 2

ただ、せっかくポインタpを動かしているのですから、毎回コピーなどをせず
pをうまく使い回せば効率良いと思います。

投稿2018/08/01 13:18

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問