• ベストアンサー

困っています

文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。途中まで考えたのですが、分かりません。教えてください。宜しくお願いします。 #include <stdio.h> char str(30); printf("文字列を入力") while (1) { ch=getchar(); if (ch==EOF) break;

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#2補> #include <stdio.h> unsigned str_length(const char str[]){ unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]){ unsigned i; i = str_length(str); while (i-- >0) putchar(str[i]); } int main(void){ char str[30]; int ch,i=0; printf("文字列を入力\n"); while (1) { if (EOF==(ch=getchar())) break; else str[i++]=ch; } str[i]='\0'; printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

gsosba
質問者

お礼

ありがとうございます。おかげさまで分かりました。

その他の回答 (4)

回答No.4

> どこが駄目か教えてください。宜しくお願いします。 > (コンパイルエラーです。) どの行でどんなエラーが出たかくらいは明記すべし。 ところで、↓に従うつもりはないのですね。 1. 文字列格納領域: char str[30]; を用意し、 2. 入力された文字列を"そのまま"strに格納し、 2.5 strの内容を逆順にし、 3. strを出力する

gsosba
質問者

補足

コンパイルはできました。しかし、実行してもできません。 何か文字列を入力して、 そして、Ctr1+Zを押す。ここで、本当なら、逆順のプログラムが、表示されるのですが、ZZZとなってしまってプログラムが表示されません。そこで、Enterを押すと、逆順から表示とでるのですが、文字列が文字化けみたいになってしまいます。どうすればいいですか教えてください。宜しくお願いします。別に従うつもりがないわけではないんですが ...

  • lawson
  • ベストアンサー率44% (29/65)
回答No.3

要素数がNだとして。 str[0]と、str[N-1]を入れ替えます。 str[1]と、str[N-2]を入れ替えます。 str[2]と、str[N-3]を入れ替えます。 ・ ・ ・ そうすると、期待通りの結果になりませんか? indexを0から(N/2)-1まで str[index]と、str[N-1-index]を入れ替えます。 をすれば期待通りの結果になりませんか? これについては、 ↓にソースを示します。 あと、別解としては、http://www.interq.or.jp/jazz/iijima/stl/contents/reverse_etc.html std::reverse( を使う。以上。 #include <stdio.h> #define MAX 512 void reverse(char* argData); int main(int argc, char** argv) { char str[MAX]; int count = 0; printf("文字列を入力"); while (1) { char ch=getchar(); if (ch == EOF) { str[count] = '\0'; break; } str[count] = ch; count++; } reverse(str); printf("\n"); printf("[%s]\n", str); return 0; } void reverse(char* argData) { int size = strlen(argData); int half = size / 2; int index = 0; for( ; index < half ; index++) { char temp = argData[index]; argData[index] = argData[size-1-index]; argData[size-1-index] = temp; } }

gsosba
質問者

お礼

ありがとうございます。おかげさまで分かりました

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

参考URLが参考になるかも

参考URL:
http://okwave.jp/kotaeru.php3?qid=1438944
gsosba
質問者

補足

考えて見たのですが、どうしても分かりません。どこが駄目か教えてください。宜しくお願いします。 (コンパイルエラーです。) #include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

回答No.1

# 注意:タイトルは質問内容を端的に表したものを。 1. 文字列格納領域: char str[30]; を用意し、 2. 入力された文字列を"そのまま"strに格納し、 3. strを出力する プログラムなら書けますか? それができたら、上記(2)と(3)の間に 2.5 strの内容を逆順にし、 を追加すればいい。まずは(1)~(3)を。

gsosba
質問者

補足

考えて見たのですが、どうしても分かりません。どこが駄目か教えてください。宜しくお願いします。 (コンパイルエラーです。) #include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

関連するQ&A

  • C言語

    文字列を逆順にするプログラムを考えているのですが分かりません。(例)qwerならrewqです。入力終了は、EOFです。考えたのですが、分かりません。(コンパイルエラーです。)教えてください。宜しくお願いします。#include <stdio.h> unsigned str_length(const char str[]) { unsigned len=0; while (str[len]) len++; return (len); } void put_rstring(const char str[]) { unsigned i = str_length(str): while (i-- >0) putchar(str[i]); } int main(void) { char str[30]; int ch; printf("文字列を入力\n"); /* ----この文字列を入力したあとに、Ctrl+Zを押すと、逆から表示               で反対から、文字列が表示----*/ while (1) { ch=getchar(); if (ch==EOF) break; } printf("逆から表示"); put_rstring(str); puts("です。"); return(0); }

  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

  • 教えてください

    入力した文字列のスペースをすべて取り除く関数を返すのですが、分かりません。(例)a s d fと入力したら、asdfと表示します。途中まで考えたのですが、どうしてもできません。教えてください。宜しくお願いします。(このソースは、コンパイルエラーです。) 14: 移植性のないポインタ変換(関数a) #include <stdio.h> char a(char *st) { char *ptr=st; while(*st!='\0') { if (*st != ' ') { *ptr++=*st; } } *ptr='\0'; return(ptr); } int main(void) { char str[21]={'\0'}; int i=0; char ch; printf("文字列を入力してください:"); while(i<21) { ch=getchar(); if (ch=='\n') {break; } else if (ch != '\0' && ch != '\n') { str[i] =ch; i++; } } str[i] = '\0'; printf("%s",a(str)); return(0); }

  • 困っています

    前に質問したのですが、a s d fと入力すると、asdfと表示されます。(スペースを取り除きます)何回やってもa s d fと入力すると、すぐ終了してしまいます。本当に分からないので教えてください。宜しくお願いします。 #include <stdio.h> char *str_del(char *st) { char *ptr=st; while(*st!='\0') { if (*st != ' ') { *ptr++=*st; } } *st='\0'; return(ptr); } int main(void) { char str[21]={'\0'}; int i=0; char ch; printf("文字列を入力してください:"); while(i<21) { ch=getchar(); if (ch=='\n') {break; } else if (ch != '\0' && ch != '\n') { str[i] =ch; i++; } } str[i] = '\0'; printf("%s",str_del(str)); return(0); }

  • abcが、入力された文字列内にあるかどうかを表示するプログラム

    文字列strの中にabcが含まれていれば、1を返し、含まれていなければ0を返すプログラムが分かりません。 C言語の問題で下記のものが分かりません。どなたか知恵を貸してください。 ユーザが文字を入力し、CTRL+Zが押されるまで、半角英数字の入力(最大でも1000文字)を受け付ける。文字列「abc」が、入力された文字列内にあるかどうかを表示するプログラムを作成する。ユーザが入力した文字列が3文字未満はabcがありませんと表示させる。 そのプログラム内で以下の関数を完成させる。 int str_srch_abc(char str []) 文字列strの中にabcが含まれていれば、1を返し、含まれていなければ0を返す関数とする。 (例えばabcは連続でabcの時だけ1を返し、asbscなどはoを返します。) ちなみに自分なりにやってみたのですが、ここまでしかできませんでした。 #include<stdio.h> int main() { int str_srch_abc(char str []); char str[1000]; int ch=0, j=0; printf("半角英数字を入力してください"); scanf("%s",str); while((ch=getchar())!=EOF){ str[j]=ch; j++; } str[j]='\0'; printf("%s",str); return(0); }

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

  • C言語 プログラミング 文字列

    C言語のプログラミングについての質問です。 文字列を入力して、それを逆順に表示するというプログラムを作っているのですが、 どうしても上手くいきません。 どこか間違えているのかわかりません。 わかる方いらっしゃいましたらご回答お願いします。 #include <stdio.h> int main(void) { char data[100]; int i, leng; char c; leng = 0; c =getchar(); while((c != '\n') && (c != EOF)) { data[leng] = c; leng = leng + 1; c = getchar(); } printf("%c", data[c]); return 0; }

  • 文字列の検索

    先日同じ質問をして、プログラムの内容を修正したのですが、今度は2つ文字列を入力した後0が無限にでてきます… どなたか解説・指摘・模範解答などおねがいします。 内容は最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char *c,*d; char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(c!='\0'){ c=a; d=b; while(c!='\0' && d!='\0'){ if(c!=d) printf("0"); break; c++; d++; } } if(d='\0') printf("1"); a++; return a; return NULL; } 例 検索対象文字列:asdfghjkl 検索文字列:sdf 1と出力 検索対象文字列:asdfghjkl 検索文字列:qwer 0と出力

  • ポインタの問題です

    学校の課題である文字列をポインタを使って逆順に表示するというプログラムを作ったのですが、「問題で引数で与えられた文字列を逆順とする関数を作成せよ.ただし文字数が最大256文字であると仮定して良い.」ということなんですが、課題が求めている答えと自分が作ったプログラムがあっているか確認お願いします。 #include <stdio.h> void reverseWord(char *str); void main(void) { char *str = "sapporo"; char *p, *q; printf("元: %s\n", str); p = q = str; while (*q != '\0') q++; printf("逆順:"); while (q >= p) putchar(*q--); printf("\n"); } よろしくお願いします。

  • 質問です。

    このソースのメイン関数でabcxyzと入力すると、xがあるので、関数で、a(char *sew)が呼び出されて、この関数には、abcxyz渡って、関数内では、x以外なら、sewを++します。なぜ、x以外のabxyzと表示されないんでしょうか?xyzになるのが分かりません。教えてください。よろしくお願いします #include <stdio.h> char *a(char *sew) { char *p=sew; while (*p != 'x') { p++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

専門家に質問してみよう