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

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

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

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

Q&A

解決済

4回答

1322閲覧

C言語で文字列の文字を検出したい

aiueoaiueoaiue

総合スコア94

C

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

0グッド

0クリップ

投稿2018/07/15 06:04

###実現したい事
C言語でa(〇,〇)といった文字列を読み込んで〇の部分の文字を表示させたいと考えているのですが、実行した際に処理が止まってしまって上手くいきません。エラーも出てくれないので何がいけないのかわからないので、原因と解決策が分かる方回答お願いします。
###ソース

#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void){ char word1[20] , word2[20]; char *a, *b, *ac, *bc; char *decidea1, *decidea2, *decideb1, *decideb2, *kekka; int i, j, k; strcpy(word1, "a(x,f(y))"); strcpy(word2, "b(y,z)"); ac = (char*)malloc(10); bc = (char*)malloc(10); a = word1; b = word2; ac = strchr(a, (int)','); bc = strchr(b, (int)','); i = ac - a-1; j = ac - a+1; if(a[i] >= 'a' && a[i] <= 'z'){ printf("%c", a[i]); decidea1[0] = a[i]; printf("%d,%d", i, j); } else{ sprintf(decidea1, "%c%c%c%c ", a[i-3], a[i-2], a[i-1], a[i]); } printf("aの前は%sです\n", decidea1); k = j+1; if(a[j] >= 'a' && a[j] <= 'z'){ while(a[k] != '\0'){ printf("%c\n", a[j]); if(a[k] == '('){ sprintf(decidea2, "%s ", decidea1); printf("%s\n", decidea2); break; } else{ decidea2[0] = a[j]; } k++; } } else{ sprintf(decidea2, "%c%c%c%c ", a[j], a[j+1], a[j+2], a[j+3]); } printf("aの後ろは%sです\n", decidea2); i = bc - b-1; j = bc - b+1; if(b[i] >= 'a' && b[i] <= 'z'){ decideb1[0] = b[i]; } else{ sprintf(decideb1, "%c%c%c%c ", b[i-3], b[i-2], b[i-1], b[i]); } printf("bの前は%sです\n", decideb1); k = j+1; if(b[j] >= 'a' && b[j] <= 'z'){ while(b[k] != '\0'){ if(b[k] == '('){ sprintf(decidea2, "%c%c%c%c ", b[j], b[j+1], b[j+2], b[j+3]); break; } else{ decideb2[0] = b[j]; printf("%s\n", decideb2); } k++; } } else{ sprintf(decideb2, "%c%c%c%c ", b[j], b[j+1], b[j+2], b[j+3]); } printf("bの後ろは%sです\n", decideb2); sprintf(kekka, "%s %s, %s %s", decidea1, decideb1, decidea2, decideb2); return 0; }

###補足
ソースは現段階ではベタ打ちです。
ソースの例ではxとf(y)とyとzが表示されてほしいです。

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

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

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

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

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

episteme

2018/07/21 05:42 編集

a(b(x,y),c(z,t)) にも対応せんならん? だとしたらかなり厄介
guest

回答4

0

まず、decidea1[0] に値を入れていますが、 decidea1は、 char * として宣言されているだけなので、動作は不明(普通は、エラーで落ちると思います)
と思ったら、

char *decidea1, *decidea2, *decideb1, *decideb2, *kekka;

が全て領域確保無しで、使われています。

動作的には問題無いと思うが、、、
ac, bc に malloc()で領域確保していますが、その直後に、 "ac = strchr(.." として値をセットしているので、 malloc()が無意味(リーク)

とりあえず、ここまで。


ちょっと追ってみたのでのですが、結構、面倒。デバッガを使って、動きを追いましょう、、って言いたくなりましたが、それでは回答になりませんので、いくつか。

投稿2018/07/15 07:44

pepperleaf

総合スコア6383

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

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

0

pepperleaf さんが指摘された、5つのポインタ変数を初期化せずに使っている件はどうなったでしょうか?

大げさかもしれないが、あまりに明らかな低品質コードに危機感(笑)を覚えたので、対策のひとつとして手っ取り早いと思う案を示します。

C

1int main(void) { 2 char word1[20], word2[20]; 3 char *a, *b, *ac, *bc; 4 char *decidea1, *decidea2, *decideb1, *decideb2, *kekka; 5 int i, j, k; 6 7 // 次の5行で、ポインタ変数が指すメモリを割当てる(ポインタ初期化) 8 decidea1 = malloc(20); 9 decidea2 = malloc(20); 10 decideb1 = malloc(20); 11 decideb2 = malloc(20); 12 kekka = malloc(20); 13 // 以下省略

それぞれ20バイトも必要無さそうですが、word1[], word2[] の大きさに合わせてみました。
追記
朝ごはん食べたら、よくわかった(苦笑)。こう変えるだけでしたね。

C

1 char decidea1[20], decidea2[20], decideb1[20], decideb2[20], kekka[20];

投稿2018/07/20 14:24

編集2018/07/21 00:16
rubato6809

総合スコア1380

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

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

0

自己解決

decidea1[0] = a[i];のような部分を

sprintf(decidea1, "%c", a[i]);のようにすると上手くいきました。

投稿2018/07/20 12:07

aiueoaiueoaiue

総合スコア94

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

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

rubato6809

2018/07/20 14:09

pepperleaf さんが指摘された、5つのポインタ変数を初期化せずに使っている件はどうなったでしょうか? これがそのままなら、解決できたと思うのは早計です。 「〜のようにすると上手くいきました」・・・これだけで動作するようになったのであれば、たまたま運がよかったにすぎません。どこのメモリ内容を壊すか分からない、他の人のコンピュータでは動作しない可能性の高い、間違ったプログラムです。現に私の手元ではコアダンプを起こし動作しません。
guest

0

Windowsでやってるなら、VisualStudioとかEclipseとか、その他にもC言語用デバッガ・統合環境はいろいろあるからそういうのを使ってデバッグしてみれ。
任意のところで実行を止めて変数の値をモニタするとかできるぞ。

投稿2018/07/15 08:06

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問