文字列を交互に

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kiraas

文字列を交互に

#1

投稿記事 by kiraas » 1年前

キーボードから2つの文字列を入力してそれを交互に表示したいのです。その場合文字列は3つ必要になりますよね?例えば 入力する文字を格納する文字列
st[]st1[]の2つ用意して
交互にする処理をしてそれを別の文字列st2[]に格納してそれを表示するんですよね?
実行結果例 st ABC st1 ZXW st2 AZBXCW
↑の考えが合ってるかわからないので教えてほしいです。
間違っているならなにが間違ってるか教えてほしいです。
あとfor文を使い交互にするやり方教えてほしいです。

アバター
usao
記事: 1889
登録日時: 11年前

Re: 文字列を交互に

#2

投稿記事 by usao » 1年前

> キーボードから2つの文字列を入力してそれを交互に表示

というのを素直に読めば,
入力が
2つの文字列 "Cat" と "Dog" だった場合,
Cat Dog Cat Dog Cat Dog ... (何回続けるのか知らんが)
という表示をする,という話と思うのだが…

> 実行結果例 st ABC st1 ZXW st2 AZBXCW

といっているからどうやら解釈が違う様子.
"ABC" と "ZXW" が入力された際に,これらの先頭側から1文字ずつ取り出して表示していく話になっていると見える.
それで合ってる?
(2つの文字列の長さが違ったらどうするんだ?)

---

> 文字列は3つ必要になりますよね?

必要かどうかは要件次第であろう.
「交互にどうのこうのした結果の文字列データを作れ.そしてそれを表示しろ.」という話なのであれば必要だろうけど,
「交互にどうのこうのした表示を行え.」というだけであれば,とにかく表示すれば良いのであって,一旦結果を作る必要は無いであろう.

---

> あとfor文を使い交互にするやり方教えてほしいです。

「そこをどうやればいいのかを考えろ」という趣旨の問題であろうと思うので,そこまで他者に求めるのあれば,あなたがこの問題に取り組む意味は全く無いものと思える.

アバター
usao
記事: 1889
登録日時: 11年前

Re: 文字列を交互に

#3

投稿記事 by usao » 1年前

> for文を使い

「forを使ってやれ」という特別な指示があるのでもなければ,そんな実装詳細のところに変にこだわらない方が楽だと思うけど.

まずは「具体的にどう実装するか?」という点は度外視して,処理アルゴリズムを考えるべき.

アバター
usao
記事: 1889
登録日時: 11年前

Re: 文字列を交互に

#4

投稿記事 by usao » 1年前

1文字ずつ交互に織り込んだような結果になるやつをやりたいのだとして,それがすぐにできそうにないなら,
とりあえず 交互に織り込む ところは無しの状態で,
単に1文字ずつ表示することをやってみるべきであろう.
これができなければ,より難しい処理をやれるはずもないので.

例えば "ABC" と "12345" の2つが入力されたときに,1行に1文字ずつ
A
B
C
1
2
3
4
5
とか表示することをやってみると良かろう.
その経験を経たうえで,本来の問題を考えてみれば,すんなり解けるのではないかと想像する.

アバター
usao
記事: 1889
登録日時: 11年前

Re: 文字列を交互に

#5

投稿記事 by usao » 1年前

オフトピック
以上は,自分で取り組むつもりのある人に対してのアドバイスのつもりであるが,
「いや,そういうのはいらないから,そのままどこぞに提出できる形のコードだけよこせや」というようなタイプの人には,こういうのはただただ迷惑であろう.

というわけで,課題っぽい雰囲気の話についてこういう場所で質問する場合には,
どっち側のスタンスなのかを明確に述べるとミスマッチが無くて良いのではないかと思う.

box
記事: 2002
登録日時: 14年前

Re: 文字列を交互に

#6

投稿記事 by box » 1年前

実行結果例 st ABC st1 ZXW st2 AZBXCW
何を入力したときにそうなってほしいかを具体的に述べてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

Re: 文字列を交互に

#7

投稿記事 by 幸尚 » 1年前

for分の文法は

コード:

for (初期化; 条件式; 変化式) {
	実行する処理;
}
となります。

例えば0~9までの数を表示したい場合のコードは以下になります。

コード:

#include <stdio.h>

int main() {
	int i;
	for (i=0; i<10; i=i+1) {
		printf("i=%d\n", i)
	}
	return 0;
}
最初に書いたfor分の文法にそって説明すると

コード:

for (i=0; i<10; i=i+1)
i=0が初期化で変数iを0にするということです。
i<10が条件でiが10よりも小さい場合、実行する処理が実行されます。
i=i+1が変化式になります。

もっと噛み砕いて説明すると
① iに0を設定する。
② iが10よりも小さいかどうかチェックする。
③iに1を加算する。
④②の処理に戻る。

①~④までの処理がiが10よりも小さい間、つまりiの値が10まで実行されます。

というのがfor文の文法となってます。

それでご質問の問題ですが
キーボードから2つの文字列を入力してそれを交互に表示したいのです。
まず、キーボードから文字列を取得するにはscanf()という関数を使います。
2つの文字列なのでscanf()を2つ使います。

今までの説明をコードにすると

コード:

#include <stdio.h>

int main()
{
	char st[256];
	char st1[256];
	char st2[256];

	printf("1.なにか文字列を入力してください。");
	scanf("%s", st);
	printf("2.なにか文字列を入力してください。");
	scanf("%s", st1);
		
	for (初期化; 条件式; 変化式) {
		//ここに「交互にする処理」を入れる。
	}
	return 0;
}
上記になります。

「交互にする処理」はもう少し詳しく説明して頂かないと分かりませんのでそこはご自分で実際に組んで貰って
また分からなければ何がわからないのかを詳しく説明して上で質問しれ貰えればよいかと思います。

グダグダになってしまいましたが以上です。
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

Re: 文字列を交互に

#8

投稿記事 by 幸尚 » 1年前

すいません、ちょっと間違っていたので修正しますね。
もっと噛み砕いて説明すると
① iに0を設定する。
② iが10よりも小さいかどうかチェックする。
③iに1を加算する。
④②の処理に戻る。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
もっと噛み砕いて説明すると
① iに0を設定する。
② iが10よりも小さいかどうかチェックする。
③iに1を加算する。
⑤printf()でiの値を表示する。
⑥②の処理に戻る。
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字列を交互に

#9

投稿記事 by みけCAT » 1年前

幸尚 さんが書きました:
1年前
もっと噛み砕いて説明すると
① iに0を設定する。
② iが10よりも小さいかどうかチェックする。
③iに1を加算する。
⑤printf()でiの値を表示する。
⑥②の処理に戻る。
これは間違っています。
③と⑤の順番が逆です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

Re: 文字列を交互に

#10

投稿記事 by 幸尚 » 1年前

すいません…
普通に考えて表示してから加算ですよね…
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

naohiro19(ログオフ状態)

Re: 文字列を交互に

#11

投稿記事 by naohiro19(ログオフ状態) » 1年前

はい、ご理解いただいた通り、2つの文字列を交互に表示する場合、3つの文字列が必要になります。1つ目の文字列には最初の文字列を格納し、2つ目の文字列には2番目の文字列を格納し、3番目の文字列には交互に格納された文字列を格納します。

以下は、forループを使って2つの文字列を交互に表示する例です。

コード:

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

int main() {
    char st[100], st1[100], st2[200];
    int i, j, k;

    printf("1つ目の文字列を入力してください:");
    fgets(st, sizeof(st), stdin);

    printf("2つ目の文字列を入力してください:");
    fgets(st1, sizeof(st1), stdin);

    i = j = k = 0;
    while (st[i] != '\0' && st1[j] != '\0') {
        st2[k++] = st[i++];
        st2[k++] = st1[j++];
    }

    while (st[i] != '\0') {
        st2[k++] = st[i++];
    }

    while (st1[j] != '\0') {
        st2[k++] = st1[j++];
    }

    st2[k] = '\0';

    printf("交互に表示された文字列は:%s\n", st2);

    return 0;
}
この例では、fgetsを使用して2つの文字列を入力し、3つの文字列を宣言しています。ループの開始時に、変数i、j、kを0に初期化します。iは1つ目の文字列の現在の位置を示し、jは2番目の文字列の現在の位置を示し、kは交互に格納された文字列の現在の位置を示します。whileループを使用して、stとst1の各文字を交互にst2に格納します。最後に、stまたはst1の残りの文字がst2にコピーされ、st2にnull終端文字が追加されます。

この方法を使用すると、交互に表示された文字列を1つの文字列に保存できます。ただし、この例では、fgetsが改行文字を読み取るため、ユーザー入力に改行文字が含まれる場合、結果に改行文字が含まれることに注意してください。

アバター
あたっしゅ
記事: 665
登録日時: 14年前
住所: 東京23区
連絡を取る:

Re: 文字列を交互に

#12

投稿記事 by あたっしゅ » 1年前

東上海美「
#11>以下は、forループを使って2つの文字列を交互に表示する例です。

コードには、for ではなく while が使ってあったのでw
chatGPT のコピペみみ ?
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

返信

“C言語何でも質問掲示板” へ戻る