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

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

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

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

Q&A

解決済

4回答

49822閲覧

文字列から特定の文字を消去するプログラムをつくりたい!

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/12/20 01:30

###前提・実現したいこと
入力された文字列から「o」を消去するプログラムをつくりたいです。
今はHelloWorldと入力する前提で行うので、結果はHellWrldとなります。

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

実行するとHellrになる(HellWrldとなってほしいのに。) コンパイル自体はできます。

###該当のソースコード

#include<stdio.h> int main(){ char a[50]; char b[50]; int i, j, k, count1; printf("対象とする文字列(50文字以内):"); scanf("%s", &a); //count1に文字列aの長さを入れる。 count1=0; i=0; while(a[i]!='\0'){ count1++; i++; } i=0; k=0; while(i<count1+1){ if(a[i]!='o'){ b[i]=a[i]; k++; } else{ j=i; while(a[i]=='o'){ k++;//何個連続したかを入れる。 i++; } b[j]=a[j+k]; } i=i+k; k=0; } printf("%s", b); return 0; }

###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)
C言語でemacsを使っています。

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

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

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

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

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

guest

回答4

0

ベストアンサー

...そんなに難しく考えなきゃダメ?
「'o'を消去する」じゃなくて「'o'じゃない文字を残す」て考えればラクやん。

C

1#define _CRT_SECURE_NO_WARNINGS 2#include<stdio.h> 3 4int main(){ 5 char a[50]; 6 char b[50]; 7 8 printf("対象とする文字列(50文字以内):"); 9 scanf("%s", &a); 10 11 int a_cnt; 12 int b_cnt = 0; 13 /* aの各文字に対し、*/ 14 for ( a_cnt = 0; a[a_cnt] != '\0'; ++a_cnt ) { 15 /* 'o' じゃない文字を bに追加する */ 16 if ( a[a_cnt] != 'o' ) { 17 b[b_cnt] = a[a_cnt]; 18 ++b_cnt; 19 } 20 } 21 b[b_cnt] = '\0'; /* '\0'で終端する */ 22 23 printf("%s\n", b); 24 return 0; 25}

投稿2017/12/20 01:50

episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2017/12/28 03:32

ありがとうございました! 自分のでも改変して一応動くようにはなりましたが、無駄が多すぎてepistemeさんのを採用させていただきます。個人的には、最後のb[b_cnt]='\0'の使い方が面白いと思いました。(僕は書いたことがなかったので)。 よいお年を!
guest

0

これでできると思います。

C

1#include<stdio.h> 2int main(){ 3 char a[50] = {'\0'}; 4 char b[50] = {'\0'}; 5 int i = 0, j = 0; 6 7 printf("対象とする文字列(50文字以内):"); 8 scanf("%s", &a); 9 while(a[i] != '\0'){ 10 if(a[i] != 'o'){ 11 b[j] = a[i]; 12 j++; 13 } 14 i++; 15 } 16 printf("%s\n", b); 17 return 0; 18}

投稿2017/12/22 15:50

teriyaki_0839

総合スコア8

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

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

LouiS0616

2017/12/22 16:15

epistemeさんの既存の回答とほぼ同一では。
退会済みユーザー

退会済みユーザー

2017/12/28 03:35

ありがとうございました! 無事解決しました。 よいお年を!
guest

0

//何個連続したかを入れる。でなく代入をスキップしてみました。

c

1#include<stdio.h> 2int main(){ 3 char a[50] = {'\0'}; 4 char b[50] = {'\0'}; 5 int i, j, k, count1; 6 7 printf("対象とする文字列(50文字以内):"); 8 scanf("%s", &a); 9 //count1に文字列aの長さを入れる。 10 count1=0; 11 i=0; 12 while(a[i]!='\0'){ 13 count1++; 14 i++; 15 } 16 i=0; 17 k=0; 18 while(i<count1){ 19 if(a[i]!='o'){ 20 b[k]=a[i]; 21 k++; 22 } 23 i++; 24 } 25 printf("%s\n", b); 26 return 0; 27}

投稿2017/12/20 02:38

A.Ichi

総合スコア4070

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

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

Zuishin

2017/12/20 03:16 編集

間違ったコメントをしました。
退会済みユーザー

退会済みユーザー

2017/12/28 03:34

常にaの添え字は動かしbは合致したときだけ動かす、というのがポイントだったんですね。 ありがとうございました! よいお年を!!
guest

0

C言語

1 while(i<count1+1){ 2 if(a[i]!='o'){ 3 b[k]=a[i]; 4 k++; 5 } 6 i++; 7 }

他にも突っ込みたいところはありますが、気になった該当箇所を。
else以降が基本的に不要。

特に検証したわけではありませんが、こんな感じで。

投稿2017/12/20 01:47

ardin

総合スコア546

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

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

退会済みユーザー

退会済みユーザー

2017/12/28 03:32

そのコードで動きました! ありがとうございました。 よいお年を!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問