• 締切済み

文字の入れ替えについて

C言語まったくの初心者です。 文字の入れ替えについてなんですがよくわかりません。 キーボードから文字列を入力させてその先頭の文字と最後の文字を入れ替えるようなものを作りたいんですが。 VWXYZ → ZWXYV のような感じにしたいんです。 参考書だとよくわかりません。 わかるかたおねがいします。

noname#228789
noname#228789

みんなの回答

回答No.5

Cnetuserさんへ。 fgetsを用いてファイルから文字列を読み込み、 最初と最後の文字列を入れ替えるという作業について、回答させていただきます。 前回の回答の (1)に関して、ファイルに記述されているのは文字で、文字は1バイトのchar型データであるとします。 (2)に関して、一時保存用のchar tmpを作成します。 また、読み込み対象のファイルはCドライブにout.txtという名前で保存されている仮定し(プログラム中のC:\\out.txtに相当)、 中にはVWXYZという文字が文頭に記述されているとします。 すると以下のプログラムで目的の動作が果たせると思います。 int main( ) { FILE *fp ; char vc[ 6 ] ; char tmp ; fp = fopen( "C:\\out.txt", "r" ) ; fgets( vc, 6, fp ) ; tmp = vc[ 0 ] ; vc[ 0 ] = vc[ 4 ] ; vc[ 4 ] = tmp ; printf( "%s", vc ) ; return 0 ; } 当然ですが、このプログラムも実用性や信頼性が皆無です。 問題点の発掘、改良はご自分で行っていただけると幸いです。 以上で言葉足らずですが、回答とさせていただきます。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

> printf( "必ず入力はa~zの間で5文字行ってください : " ) ; 5文字入力するのであれば、終端の'\0'を含めて、 領域は6バイト必要だと思います。

回答No.3

C言語は慣れるまではなかなかソースや入門書を読んでも直感的に分かりづらいものですよね^^; 以下では配列で定義されたデータの概念は分かっていると仮定して話を進めさせていただきたいと思います。 C言語などのプログラムで数字や文字を入れ替える場合には次の二点を 守る事が基本的な考え方を身に着ける方法ではないかと思います。 (1)入れ替える対象が文字なのか数字なのかを考える (2)入れ替え作業のためにデータの一時保存用の変数を確保する です。 (1)に関して、今回の場合はおそらく文字で、一文字が1バイトのchar型データであると思われます。 (2)に関して、一文字がchar型のデータですから、データの一時保存用の変数をchar tmpとして作成しましょう。 そして、キーボードから入力された文字が保存される配列をchar vc[5];というデータであると仮定します。 すると,文字Vはvc[0]に、文字Zはvc[4]に保存されますから、次の3つの手順を踏んでデータの入れ替え作業を行います (1)上で定義したtmpにvc[0]を一時保存する (2)vc[0]にvc[4]を代入する (3)vc[4]にtmpを代入する 以上の作業で0番目と4番目のデータの入れ替えが完了します。 もし、(2)の作業を最初にやってしまうと、vc[0]もvc[4]も同じ文字になってしまうので、入れ替える事が出来なくなりますね? つまり、データの入れ替え作業では、入れ替えを行う前に、いったん入れ替え対象となるどちらかのデータを一時保存しておく必要があるということです。 以下には簡単に最初の文字と最後の文字を入れ替えるプログラムの例を示します。 int main( ) { char vc[ 5 ] ; char tmp ; printf( "必ず入力はa~zの間で5文字行ってください : " ) ; scanf( "%s", vc ) ; tmp = vc[ 0 ] ; //(1)に相当 vc[ 0 ] = vc[ 4 ] ; //(2)に相当 vc[ 4 ] = tmp ; //(3)に相当 printf( "%s", vc ) ; return 0 ; } ただし、上のプログラムは実用性や信頼性が皆無です。何がいけないのかは今後C言語についてたくさん勉強してご自分で考えていただけたら幸いです。 以上を言葉足らずですが回答とさせていただきます。

noname#228789
質問者

補足

くわしくありがとうございます。 なんとかうごかすことができました。 ずうずうしいとは思いますが。scanfを使わずfgetsでやる 方法はどうすればいいのでしょうか?よろしくおねがいします。

回答No.2

1 char x;  char y;  の互いの内容を入れ替えるコードは書けますか? 2 同様に char str[5];  があるとき、str[0] と str[3] を入れ替えるコードは書けますか? 3 [2]ができるなら簡単ですね、str[0]とstr[末端のインデクス]  を入れ替えてください。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

途中まででもよいので、その機能を実現するためのコードを書かれましたか? それとも、にっちもさっちもいかない状態ですか?

関連するQ&A

  • 文字列の入れ替え

    2つのchar型配列x[],y[]に格納された文字列を入れ替えるプログラムを作成せよ。ただし入替え処理には、関数swap_array(char [],char [])を作成して用いること。という問題なのですが、下記の実行例では、2つの文字列xとyをキーボードから入力し、入れ替えた後に表示している。 <実行例> % ./irekae 文字列x (20字まで)? Mojiretsu 文字列y (20字まで)? Irekae 関数swap_array()を呼び出しました 入替後の x: "Irekae" 入替後の y: "Mojiretsu" % となっているのですが文字列を格納するところまでしかわかりません。 どなたか教えていただけないでしょうか? #include<stdio.h> int main(void) { char x[21]; char y[21]; printf("文字列 (20字まで)? "); scanf("%s", x); printf("文字列 (20字まで)? "); scanf("%s", y);

  • 文字列の部分読み込み

    C言語によるプログラムを勉強中なのですが、分からないことがあるので質問させてください。 「fgets」を用いてファイルから一行分の文字列を読み込んだのですが、この文字列の○文字目から×文字目を読み込む関数などはあるのでしょうか? もし無ければ、どのようにしたら読み込めるのでしょうか? 読み込んだ文字列は □□□□1234□□□5678□□abcd のようなもので、□は半角のスペースです。 区切り文字などが無く、先頭の半角スペース部分に文字が入る場合もあるので、○文字目から×文字目のように指定したいと思っています。 初心者で申し訳ありませんが、よろしくお願いいたします。

  • cプログラミングについて

    現在c言語を勉強しているのですがどうしてもわからないので質問させてください。 キーボードから不特定多数の文字列を入力した際に、特定の文字に対してのみ特定の処理を施したい場合どうすればよいのでしょう? 例えば、 ・行の先頭の英小文字を英大文字に変換する ・\の後に入力されている数値を100倍にする などです。よろしくお願いします。

  • 文字列の最後のスペースを知るには?

    C言語初心者です。変な質問でしたらすみません。 C言語で、文字列"aaa bbbb ccc fff" という文字列があるとします。 この時fffの文字だけ取り出したいと思っています。 そこで最後のスペース(fffの前)の位置が分かれば見つける事ができると思います。 このスペースを見つけるライブラリ関数などございませんでしょうか? また、なければどうやって探したらよいか、教えていただけたら幸いです。 以上です。 よろしくお願いします。

  • 文字列

    ・文字列をキーボードから入力する関数を作成する。 書式:char *StrInp(char *pDefStr, int nLen); 引数:char *pDefStf; 初期文字列 int nLen; 入力可能文字数(1~79) 戻り値:正常ならば、入力した文字列の先頭ポインタ、エラー時はNULL。 処理:pDefStrに与えた文字列を初期値とする文字入力を行う。    nLenで指定した文字数まで入力可能とし、その範囲は1~79    までする。入力時の初期カーソル位置は与えた文字列の最後    になります。初期文字列が必要ない場合はヌル文字を与えます。    初期文字列を与えられた場合は、その文字列も更新可能とする。   ・入力の終了は「リターン」キーとする。   ・「BS」キーを押すと、カーソルの1文字前の文字前の文字を    消去する。 という、問いです。難しくてわかりません。どなたかたすけてください。        

  • 大文字の文字列→小文字の文字列

    C言語初心者です。 ある演習問題をやっていて詰まっています。 自分で入力した大文字の文字列を小文字にするプログラムを作るという問題なのですが、↓の条件があり、こんがらがってしまいました。 ・入力した文字列に小文字が含まれていたら、エラーと表示して再び入力を促し、0を入力するとプログラム終了という流れにする。 ・ポインタ変数を使う。 ・continue文を使う。 ・標準ライブラリ関数は使わない。 です。 ・continue文というのがよくわからない。 ・宣言した関数でどの処理をすればいいのかわからない。 ・大文字を小文字にするというプログラムがわからない。 (アスキーコードをどう使うのか) でつまっています。 どなたかアドバイス・解説・模範解答・指摘などしていただけないでしょうか。 よろしくお願い致します。

  • C言語で全角文字を扱いたいのですが、

    C言語で全角文字を扱いたいのですが、 全角文字列を入力して特定の箇所の文字(例えば3文字目)を抜き出して、表示するという感じのプログラムをしたいのですが、うまくいきません。 半角文字ならば、配列を使ってできるのですが・・・・・

  • エクセルの文字入力について

    ・HPのある1行をコピーしてエクセルのA列の1行目に貼り付けると、先頭が2字分くらいスペースをとった状態ではりついてしまいます。 先頭へきちんとはりつけるにはどうすればいいでしょう? 尚、このときに文字薄いブルー色になります。元の色(HP上で)は黒だったのですが。どうして? 次にA列2行目から新しく文字入力をすると、1行目と同じ状態になってしまいます。 貼り付けた文字もあららしく入力した文字も揃えるにはどうすればよいのでしょう。初心者でよろしくお願いします。 エクセルは2003だと思います。xp使用です。

  • C言語での文字列より値を抜き出す

    C言語初心者です。 たとえば、”ABCDE”という文字列があります。 その文字列の2桁目から3文字を取得したい場合、 どのようにすればよろしいでしょうか。  上記の場合、”BCD”が欲しい SQLだと、SUBSTR(B)関数がありますが、C言語には 同様な関数があるのでしょうか。 また、C++ではどうでしょうか。 お客さんに突然聞かれたので、本屋に行く余裕もありませんでした。 どなかた教えてください。お願いします。

  • 文字列で条件分岐 if swtich

    C言語でifやswitch文の条件式でキーボード入力からの複数文字列(char型)に対して条件分岐をしたいのですが、どなたか具体例を教えていただけないでしょうか?またscanfでキーボード入力を読み込む場合、Enterを押さないと実行されませんが、Enterを押さないでもいい関数や方法があれば教えて下さい。宜しくお願いします。