• ベストアンサー

プログラミング C++

プログラミングのC言語で入力文字を関数を使ってポインタを使わずに逆順にするプログラムを作りたいのですが、ポインタを使ってならできるのですが、ポインタを使わずにはどのように考えればいいでしょうか?。 #include <string.h> void reverse (char *ss); int main(void) { char ss[14]; gets(ss); reverse(ss); printf("逆順=%s\n",ss); return 0; } void reverse(char *ss) { int a,b,c; b=0; c=strlen(ss)-1; while(b<c){ a=*(ss+b); *(ss+b)=*(ss+c); *(ss+c)=a; b++; c--; } }

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

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

ポインタを使わずにすませるのは無理ではないかと思います。 下記のコードは一見ポインタを使っていないように見えるかもしれませんが、実際は使っています。 #include <stdio.h> #include <string.h> void reverse (char ss[]); int main(void) { char ss[14]; gets(ss); reverse(ss); printf("逆順=%s\n", ss); return 0; } void reverse(char ss[]) { int b, c; char a; for (b = 0, c = strlen(ss) - 1; b < c; b++, c--) { a = ss[b]; ss[b] = ss[c]; ss[c] = a; } }

balantyo
質問者

お礼

ありがとうございます。わかりました。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

C言語なのかC++なのかよく分かりませんが、両方書いてみます。 まずはCから、 #include <stdio.h> int main() {  int c = getchar();  if (c != EOF && c != '\n')  {   main();   putchar(c);  }  return 0; } C++は素直に、 #include <iostream> #include <string> #include <algorithm> int main() {  std::string s;  std::getline(std::cin, s);  std::reverse(s.begin(), s.end());  std::cout << s << std::endl;  return 0; } とでもしておきましょう。 関数の呼び出しやstd::endlも関数へのポインタを使っていることになるのかもしれませんが、少なくともポインタを意識する必要はないはずです。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

ポインタを使わない、という条件設定は厳密な 表現が要求されるところです。なにしろ、プロ グラムというものはポインタの塊ですからね。 まあ、ここではreverse関数の引数のポインタ 表現に限定するのでしょうね。 void reverse(char ss[]) として配列処理するということでしょう。 頑張って考えてください。

関連するQ&A

  • プログラミング 関数

    逆順する関数reverseを作成したいんです。 以下のは関数reverseを利用したmainのプログラムです。 #include <stdio.h> void reverse(char str1[],char str2[]); int main (void) { char strin[255]="abcdefg"; char strout[255]; reverse(strin, strout); printf(" input=%s\n",strin); printf("output=%s\n",strout); return 0; } 教えてください。

  • プログラミング

    C++で、五個の配列を確保し、それらを関数を使って逆順にしたいのですが、別の配列にコピーして逆順にしたいです。下記のプログラムを作ったのですが、どこがいけないのでしょうか? #include "stdafx.h" #include <stdio.h> void reverse (int z[],int w[]); int main(void) { int p[5]={1,2,3,4,5},u[5]; reverse(p,u); printf("逆順=%d\n",p); return 0; } void reverse(int z[],int w[]) { int i; for(i=0;i<=5;i++){ w[i]=z[i-1]; } }

  • 文字の並べ替え

    C言語で文字の並べ替えをしたいのですが条件があり ポインタを使って文字を並べ替える別の関数をを渡さなければなりません.(void reverse(char *str)をつくる) そこで作ったのが #include <stdio.h> #include <string.h> void reverse(char *str); int main(void){ char s[80]; gets(s); reverse(s); printf("%s\n",s); return 0; } void reverse(char *str){ char q[80]; int i,n; n=strlen(str)-1; str+=n; for(i=0;i<=n;i++)q[i]=*str--; str++; q[i]='\0'; for(i=0;i<=n;i++)*str++=q[i]; } なのですが ポインタを使っている意味が余りないので ポインタを使うよりよいプログラムを教えてください. (アドバイスでもかまいません.)

  • c言語の文字列の逆順のプログラムがわかりません

    文字列を逆順して出力するプログラミングがわかりません。 #include <stdio.h> #include <string.h> void reverse(char *moji, char *gyaku); int main(void) { char x[30]; char y[30]; puts("文字を入力してください。\n"); scanf("%s", x); reverse(x, y); printf("逆順すると%sです。\n", y); return (0); } void reverse(char *moji, char *gyaku) { int i, len; len = strlen(moji); gyaku = moji + len - 1; for(i = 0; i < len; i ++){ putchar((int)*gyaku); gyaku--; } } 理想とする実行結果は 文字を入力してください。 abcdefg 逆順するとgfedcbaです。 なんですが、 上記のソースを実行すると 文字を入力してください。 abcdefg gfedcba逆順すると(謎の漢字)です。 となります。 どこがおかしいんでしょうか? よろしくおねがいします。

  • プログラム

    文字列を逆順にする関数を作ってるのですがうまくできません。 void reverse(char *str, int count=0) { int i; char *s="momonga"; s+=strlen(s); count=strlen(s); for(i=count; i<0; i--, str++, s--){ *str++=*s++; } } int main() { char s1[20]; int c; reverse(s1,c); printf("%momongaを逆順にすると%sで文字数が%dです",s1,c); return 0; } このプログラムの間違ってる所をおしえてください。

  • 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; }

  • abcdとキーボードで打ったらdcbaと表示されるプログラム

    C言語に関しては初心者です。 メイン関数は変更せずに行います。 /* reverse.c: reverse a given string */ #include <stdio.h> #include <string.h> void reverse(char *); /* プロトタイプ宣言 */ int main(void) { char str[100]; scanf("%s", str); reverse(str); printf("%s\n", str); return (0); } void reverse(char *s) { char n; int i; char str; n = strlen(str) - 1; for(i=0,i++,i<=100) { s[i] = *s[n-i]; printf("%s\"s[i]); } }

  • c言語についてです。

    文字の順番を逆さまにするプログラムなのですが実行してenterキーを押しても何もおこりません。原因がわかる方がいたら教えてほしいです。 初歩的な質問ですみません。 使っているパソコンはMacBookProです。 #include<stdio.h> void reverse(char[],char[]); void divide(char[],char[]); int main(void) { char s[100],t[100]; gets(s); reverse(s,t); divide(t,s); printf("%s %s\n",s,t); return 0; } void reverse(char s[],char t[]) { int i=0,j=0; while(s[i]!=0){ i++; } i--; while(i>=0){ t[j]=s[i]; i--; j++; } t[j]=0; return ; } void divide(char t[],char s[]){ int i=0,j=0; while(t[j]!=' '){ i++; } t[i]=0; i++; while(t[i]!=0){ s[j]=t[i]; j++; i++; } s[j]=0; return ; }

  • プログラミング(配列と関数の引数)

    a : ABCDE a : ABCDEFGH Len : 8 a : FGHIJ a : FGH a : FGH, c : FGH 上記のように表示されるプログラムを作りたいのですが、なかなかできません。下記のようなプログラムを作ったのですがどこが間違っているのかよくわかりません。分かる方、指摘をお願いします。 #include <stdio.h> void my_strcpy(char s[], char t[]); int my_strlen(char s[]); void my_strcat(char s[], char t[]); int main(){ char a[10]; char b[10] = "ABCDE"; char c[] = "FGH"; int len; my_strcpy(a, b); printf("a : %s\n", a); my_strcat(a, c); printf("a : %s\n", a); len = my_strlen(a); printf("Len : %d\n", len); my_strcpy(a, "FGHIJ"); printf("a : %s\n", a); a[3] = '\0'; printf("a : %s\n", a); if(strcmp(a, c) == 0){ printf("a : %s, c : %s\n", a, c); } int i, s, t; my_strcpy(a, b + 2); printf("a : %s\n", a); void my_strcpy(char s[], char t[]){ for (i = 0; t[i] != '\0'; i++){ s[i] = t[i]; } s[i] = '\0'; } int my_strlen(char s[]){ int i; for (i = 0; s[i] != '\0'; i++); return i; } void my_strcat(char s[], char t[]){ int i, j; for (i = 0; s[i] != '\0'; i++); for (j = 0; t[j] != '\0'; i++, j++){ s[i] = t[j]; } s[i] = '\0'; } }

  • 文字列をポインタに入れる方法を教えてください。

    どなたか文字列をポインタに入れる方法を教えてください。下のプログラムのa=count(name1);とreverse(name1,name2,a);のとこにエラーが表示されます。ちなみに&を入れてもダメでした。整数の場合は&を入れたらできるみたいですが、文字列となるとやり方が違うのでしょうか? 問題としてはローマ字で名前を入力して表示し、文字数と名前を逆順にする2つの関数countとreverseを各自定義してそれぞれ定義しプログラムを組みなさい。姓と名の間は1文字空白を入れ、空白は文字数に含めないこと。 下のプログラムを実行させると・・・ 名前を入力しなさい。 yamada hirosi //自分で入力 yamada hirosi 文字数は12 逆順にした後はisorih adamay となるはずなんですが、なりません。どなたか宜しくお願いします。 #include "stdafx.h" #include <stdio.h> int count(char *name1[]) { int i,b=0; for(i=0;*name1[i]!='\0';i++) { b++; } b--; return b; } void reverse(char *name1[],char *name2[],int a) { int w; for(w=0;w<=a;w++) { *name2[w]=*name1[a-w]; } *name2[w]='\0'; } int main(int argc, char* argv[]) { char name1[80],name2[80]; int a; printf("名前を入力しなさい\n"); gets(name1); printf("%s\n",name1); a=count(name1); printf("文字数は%d\n",a); reverse(name1,name2,a); printf("逆順にした後は%s\n",name2); return 0; }

専門家に質問してみよう