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

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

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

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

Q&A

解決済

3回答

615閲覧

lexで特殊文字の判定がうまくいかない

yukas

総合スコア13

C

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

0グッド

0クリップ

投稿2022/08/10 07:28

編集2022/08/11 00:35

前提

vscodeを用いてc言語でプログラミングを書いています。

実現したいこと

「hello」を入力したら「こんにちは」に変換されるプログラムを作りたいです。

(注意)以下のようなプログラム
入力:ahello hello HELLO helloa ! ’hello’ ’hi hello world’
出力:ahello こんにちは HELLO helloa ! ’hello’ ’hi hello world’

しかし実際に書いてみると特殊文字の出力がうまくいかず、、、調べてもなかなかヒットせず困っています。

(追記)

修正依頼:「Ahello」は「Aこんにちは」になっていいんですか?
A.ならないようにしたいです。
「hello」ちょうど一致するの単語のみ「こんにちは」に変換したいです。

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

’hello'は反応させたくないのに反応してしまっている
'hi hello world’も同様

ahello hello HELLO helloa ! ’hello’ ’hi hello world’ ahello こんにちは HELLO helloa ! ’こんにちは’ ’hi こんにちは world’

該当のソースコード

c

1%{ 2 #define YY_SKIP_YYWRAP 3 #define yywrap() 1 4%} 5 6 7%% 8hello { 9 printf ("こんにちは", yytext); 10} 11[a-z]+ { 12 printf ("%s", yytext); 13} 14\'.\' { 15 printf ("%s", yytext); 16} 17%% 18 19int main(void) 20{ 21 yylex(); 22 return 0; 23}

解決に向けて行ったこと&考察

テラテイル内や、インタアーネットでlexについて検索をかけた。
バックスラッシュが半角か確かめた。

特殊文字の扱い方はバックスラッシュではダメなのでしょうか?
どなたか教えていただきたいです。

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

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

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

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

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

kazuma-s

2022/08/11 00:28

「Ahello」は「Aこんにちは」になっていいんですか?
yukas

2022/08/11 00:32 編集

なってほしくないです。 「hello」とちょうど一致する単語のみ「こんにちは」に変換するようにしたいです。
guest

回答3

0

\'.\'が任意の文字1文字だけしかマッチしていないからじゃないでしょうか。\'.*\'にしてみては。

投稿2022/08/10 08:45

RiaFeed

総合スコア2701

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

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

yukas

2022/08/10 08:51

わわ!!!「.」に繰返しの意味があるとすっかり勘違いしていました、、。 もう絶対これだ!っと思って実行しました。 ですが、ダメでした。。 結果↓ 入力 ahello hello HELLO helloa ! ’hello’ ’hi hello world’ 出力 ahello こんにちは HELLO helloa ! ’こんにちは’ ’hi こんにちは world’
yukas

2022/08/10 08:54

すみません、解決することができました。 なんとも情けないです。
RiaFeed

2022/08/10 08:54

あとはいま3番目になってる\'.*\' {} を一番上helloより上にしてみるくらいかなぁ('~'を処理する前にhelloが一致して処理してしまってる)
guest

0

ベストアンサー

lex

1%{ 2#define YY_SKIP_YYWRAP 3#define yywrap() 1 4%} 5 6%% 7hello { printf("こんにちは"); } 8[a-zA-Z]+|'[^']*' { ECHO; } 9%% 10 11int main(void) 12{ 13 yylex(); 14 return 0; 15}

入力: ahello Ahello hello Hello HELLO 'hello' 'hello hello hello' "hello"
出力: ahello Ahello こんにちは Hello HELLO 'hello' 'hello hello hello' "こんにちは"

これでいいんでしょうか?

投稿2022/08/11 04:15

kazuma-s

総合スコア8224

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

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

yukas

2022/08/11 04:29

端的にありがとうございます。 授業の資料をもとに勉強していたのですが、^の意味を調べるにあたり、正規表現が私の想像以上に存在していることを知りました。勉強になりました。
guest

0

「’」が間違っていました。。。。。
正しくは「’」でした、、、。

投稿2022/08/10 08:54

yukas

総合スコア13

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

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

kazuma-s

2022/08/11 00:12

本当に解決しましたか? 次のようになりますか? 入力: 'hello' hello 'hello' 出力: 'hello' こんにちは 'hello'
yukas

2022/08/11 00:24

ほんとですね、、、 ならなかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問