🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

解決済

2回答

534閲覧

入力した文字列から連続する特定の文字列を削除して左に詰めたい

hm1216

総合スコア6

C

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

0グッド

0クリップ

投稿2019/11/25 02:36

表題の通りです。
例えば、123ABCxyz123と入力したら123ABC123と表示されるように。

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

コンパイル自体はできますが、123ABCxyz123と入力するとそのま123ABCxyz123と表示されます。

該当のソースコード

#include "stdio.h"
#include "stdlib.h"

void Function(char[32]);

//int _tmain(int argc, _TCHAR* argv[])
int main()
{
char buff[32];

printf("文字を入力\n"); gets_s(buff, 31); Function(buff); printf(buff); return 0;

}

void Function(char text[32])
{
int i, j;

for (i = 0, j = 0; text[i] != '\0'; i++) { if (text[i] != 'xyz') { text[j] = text[i]; j++; } } text[j] = '\0'; return;

試したこと

xyzをそれぞれ一個ずつ認識させればいいのだと思いますが、やり方がわかりません。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

[質問する」ボタンを押す前に、コードの部分を選択し <code> を押してください。

xyzをそれぞれ一個ずつ認識させればいいのだと思いますが、やり方がわかりません。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4void Function(char[]); 5 6int main(void) 7{ 8 char buff[32]; 9 10 printf("文字を入力\n"); 11 gets_s(buff, 31); 12 Function(buff); 13 printf("%s\n", buff); 14 return 0; 15} 16 17void Function(char text[]) 18{ 19 int i, j; 20 21 for (i = 0, j = 0; text[i] != '\0'; i++) { 22 if (text[i] == 'x' && text[i+1] == 'y' && text[i+2] == 'z') { 23 i += 2; 24 } 25 else { 26 text[j] = text[i]; 27 j++; 28 } 29 } 30 text[j] = '\0'; 31}

このコードで理解できなところはどこですか?

追記
123ABCxyz123 と入力したら、main の buf には "123ABCxyz123" が入ります。
Function の text は main の buf を参照しますから、
text[0] = '1' text[1] = '2' text[2] = '3'
text[3] = 'A' text[4] = 'B' text[5] = 'C'
text[6] = 'x' text[7] = 'y' text[8] = 'z'
text[9] = '1' text[10] = '2' text[11] = '3' text[12] = '\0'
となります。'xyz' が入っているところはどこにもありません。

'x', 'y', 'z' の 3文字が並んで入っている
text[6], text[7], text[8] を見つけないといけません。

text[i]=='x' かつ text[i+1]=='y' かつ text[i+2]=='z' という
条件を調べるのは当然ではありませんか?
text[i]=='x' または text[i+1]=='y' または text[i+2]=='z' という
条件ではありませんよね。「かつ」「または」という表現をご存じないですか?
「かつ」は &&、「または」は || だから、&& を使うという発想が出てきます。

それから、&&演算子の意味ですが、
左オペランドが真なら、右オペランドを評価し、その真偽を結果とします
左オペランドが偽なら、右オペランドは評価せず、演算結果を偽とします。

if の条件が真なら、"xyz" が見つかったのですから、この次のところ
text[9] から探索を続けなければいけません。
今、i は 6 です。3つ進めたいのですが、for文に i++ があるので
ここでは、2つ進めておけば 3つ進みます。

else は if の条件が偽ですから、"xyz" は見つからなかったということになり
文字を詰めるために text[j] = text[i] を実行し、j を進めます。

投稿2019/11/25 03:12

編集2019/11/25 06:38
kazuma-s

総合スコア8224

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

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

hm1216

2019/11/25 04:13

詳しくありがとうございます。 void Function(char text[32]) { int i, j; /i番目がx、iの一つとなりの要[i+1]、iの二つとなりの要[i+2]、これはわかります。/&&は右辺左辺がともに真であった場合、という意味ですよね?&&は右辺左辺がともに真の場合という意味愛であることは知っていますが、ここでなぜ&&を使うという発想が出てくるのかがわかりません。 if (text[i] == 'x' && text[i + 1] == 'y' && text[i + 2] == 'z') //i += 2;はどういう意味ですか? { i += 2; } //ifでなくelseなのはなぜですか? else { text[j] = text[i]; j++; } } text[j] = '\0'; }
hm1216

2019/11/25 04:49

追加で質問です。 i += 2はi += 2(i= i +2)という意味ですよね? なぜここで加算するのですか? あと、returnがないのはなぜですか?
guest

0

xyzをそれぞれ一個ずつ認識させればいいのだと思いますが、やり方がわかりません。

手っ取り早いのは、strstr()man)のようなライブラリ関数を使ってしまうことです。

投稿2019/11/25 02:39

maisumakun

総合スコア145975

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

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

hm1216

2019/11/25 04:13

ありがとうございます。調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問