• 締切済み

ポインタの問題です

学校の課題である文字列をポインタを使って逆順に表示するというプログラムを作ったのですが、「問題で引数で与えられた文字列を逆順とする関数を作成せよ.ただし文字数が最大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"); } よろしくお願いします。

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>ただし文字数が最大256文字であると仮定して良い  と、char *str = "sapporo"; の整合は、大丈夫なんだろうか?。  「回答」から調整できるんだろうか?(文字列の入力方法など)。  また、「学校」なのに、void main(void) でいいのか心配。  (過去の質問と違うよ)  この辺り、空気を読まないと・・。 >課題が求めている答えと自分が作ったプログラムがあっているか確認お願いします。  コンパイラがあれば、自分で確認できます。今回は、oroppas となればいいわけだから。  こんなのを他人に確認させるのは、失礼かと・・。  早急に、家にパソコン・開発環境を整備したほうがよい、と思います。  なお、課題は、 >引数で与えられた文字列を逆順とする関数を作成せよ.  で、全然出来ていないのに、 >・・というプログラムを作ったのですが、・・ >・・自分が作ったプログラムが・・  「作った」と言いきれるところが、大樹の片鱗というか(*)、すごいと思います。  (単なるナルシストだったり・・、で、こんな質問文になるのかな・・) ☆「ここは、できない」とハッキリしたほうが、(*:イヤミを言われることなく)良い回答が付くと思います。 ----------------------------------------- 下のソースで「待避」とあるのは、 ・酒の入ったコップ ・水の入った茶碗があるとき、 茶碗に酒、コップに水としたいとき、空の容器が必要になりますよね、それを想像すればよいかと。 #include <stdio.h> #include <string.h> void reverseWord( char *str ) {  char cDum, *p, *q;  p = str; // 文字列先頭  q = p + strlen( str ) - 1; // 文字列末尾  while( p < q ){ // 文字列中央まで   cDum = *p; // 待避   *p++ = *q;   *q-- = cDum;  } } void main( void ) // 要調整 {  char str[ 256 ] = "sapporo"; // 要調整  printf( "元順: %s\n", str );  reverseWord( str );  printf( "逆順: %s\n", str ); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

  • S117
  • ベストアンサー率40% (18/45)
回答No.3

文字列を逆順にする関数を作ってないので題意に沿っていないでしょう。出力にもNUL文字(0x00)が入ってしまいますし。 なお、問題文はその意図するところが不明確です。 >引数で与えられた文字列を逆順とする関数を作成せよ.ただし文字数が最大256文字であると仮定して良い. どうやら引数の文字列を逆順にする関数を作ればいいようですが、反転した文字列の出力方法がわかりません。以下のような方法が考えられます。 1,引数の文字列を破壊的に変更する。 void reverseString(char *str); 2,引数の文字列を指定されたバッファへ書き出す。 void reverseString(const char *src, char *dest); 3,動的確保したバッファに書き込み、そのポインタを返す。 char *reverseString(const char *src); 4,静的な記憶領域に書き込み、そのポインタを返す。 char *reverseString(const char *src); 「ただし文字数が最大256文字であると仮定して良い」 という文が意味をなすには4の仕様しか考えられませんが、一方でこの方法は静的領域を使うために、複数の文字列を同時に扱えません。 char *a, *b; a = reverseString("abcdef"); //内部バッファは"fedcba" b = reverseString("12345"); //内部バッファは"54321" puts(a);// 54321 puts(b);// 54321 //aもbも同じ内部バッファを参照するため、最後の呼び出しの結果を持つ。 この制限は題意にないため、常識的に考えればとうてい受け入れられません。 よって、1~3になりますが、いずれも処理する文字列のサイズを制限する必要がありません。もちろん、「して良い」なのでしなくても良いはずです。 Cでは一般的にメモリ確保関数以外が返したポインタはfreeしなくていいようにします。標準関数の例を見ても1か2にすべきでしょう。 場合によりますが、破壊的な変更をする関数はあまりよくないです。 (教育現場ではしばしば用いられるようですが) というわけで、2の方法で作りましょう。 この場合、呼び出し元が責任を持って元の文字列と同じサイズのバッファを用意することで、関数自体ではバッファサイズを気にする必要がなくなります。 なお、もしも問題に >引数で与えられた文字列を逆順とする関数を作成せよ.ただし文字数が最大256文字であると仮定して良い. 以外の条件が与えられている場合、上記のアドバイスは無視する必要があるでしょう。条件にない部分はCの常識に基づき補完していますが、しばしば教育の場では異なる仕様が求められます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

えっと.... 全く課題の要求に答えていないうえに, バグまで持ってます. 「確認お願いします」だから, これだけでいいよね.... というか, これで課題が求めている答えとあっていると一瞬でも思ったというのであれば, 「どこがどのようにあっているのか」を書いてください.

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

>void reverseWord(char *str); プロトタイプ宣言だけで、実体がありません。 いいのでしょうか?

関連するQ&A

  • ポインタ

    質問なのですが、このソースのchar *str_copy(char *d, const char *s)関数内のchar *p=d;はなんで、*pにdを入れるか分かりません。それと、このdは、*dなのですか?どうして、while (*d++ = *s++) みたいに*dをつけないんですか?教えてください。宜しくお願いします。 #include <stdio.h> char *str_copy(char *d, const char *s) { char *p=d; while (*d++ = *s++) ; return (p); } int main(void) { char tmp[100]; char st1[100], st2[100],st3[100]; printf("文字列を入力してください:"); scanf("%s",tmp); str_copy(st1,str_copy(st2,tmp)); printf("文字列st1は%sです。\n", st1); printf("文字列st2は%sです。\n", st2); printf("文字列st3は%sです。\n", str_copy(st3,tmp)); return (0); }

  • C言語について

    2つの文字列を入力して別の文字列にコピーするプログラムをつくっているのですが、どこが間違っているのでしょうか?教えていただけませんか? /*文字列連結*/ void *my_stract(char*, char*, char*); void main(void) { char bun1[100],bun2[100],bun3[200]; printf("文字列1を入力してください\n"); gets(bun1); printf("文字列2を入力してください\n"); gets(bun2); my_stract(bun1,bun2,bun3); puts(bun3); } char *my_stract(char *str3, char *str2, char *str1) { char *p1, *p2, *p3; p1=str1; p2=str2; p3=str3; while(*p1) { *p3=*p1; p1++; p3++; } while(*p2) { *p3=*p2; p2++; p3++; } *p3='\0'; return str3; }

  • C言語 ポインタ エラー

    文字列を入力後改行して入力した文字列を出力したいのですが、エラーがでます。 ハンドルされない例外が 0xFEFEFEFE (helloworld.exe) で発生しました: 0xC00001A5: 無効な例外ハンドラー ルーチンが検出されました。 (パラメーター: 0x00000003)。 調べてみましたが、理解できません 何卒よろしくお願いします。 #include <stdio.h> void put_string(const char *str) { while (*str) putchar(*str++); } int main(void) { char str[100]; printf("文字列を入力してください"); scanf_s("%s", str); put_string(str); putchar('\n'); return(0); }

  • C言語のポインタと配列について

    下のコードについて2つ質問があります。 (1) char *p; p = str; ならわかるのですが、なぜ型が違う char *p = str; のような代入がOKなのでしょうか。文字列をコピーするときの   *p = *str; と比較して、とても違和感があります。  str は引数で受けた文字列の先頭アドレス。 (2)   char *str;   str = " 1 23 4 5"; と   char str[] = " 1 23 4 5"; との違いがよくわかりません。 #include <stdio.h> #include <ctype.h> void TrimSpace(char *str) {   char *p = str;        // (1)型が違うのになぜこんな代入をするのか?      while (*str != '\0') {     if ( !isspace(*str) ) {       *p = *str;      // この代入は自然       p++;     }     str++;   }   *p = '\0'; } int main(void) {      //char *str;   //str = " 1 23 4 5";     (2)これでは空白を詰めた後の文字列が表示されないのはなぜか?      char str[] = " 1 23 4 5"; //これで OK   printf("空白を詰める前:\"%s\"\n", str);   TrimSpace(str);   printf("空白を詰めた後:\"%s\"\n", str);   return 0; }

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

  • ポインタについて

    #include<stdio.h> int main(void) { char str[10]; char *ptr = str; printf("文字列を入力してください。\n"); scanf("%s",ptr); printf("文字列は%sです。",str); return 0; } 上記のプログラムのscanf("%s",ptr);の ptrに&をつけるとなぜ先頭の4文字は入力しても 表示されなくなってしまうのでしょうか? よろしくお願いします。

  • C言語ののポインタについて

    「明解C言語 入門編」p262の演習11-4についての質問です。 このサイトも参考にしてみて、 入力された文字の大文字小文字を反転するプログラムをvimで書いてみたのですが #include <stdio.h> #include <ctype.h> void str_toupper(char *str) { while (*str = toupper(*str)) { *str++; } } void str_tolower(char *str) { while(*str = tolower(*str)) { *str++; } } int main(void) { char str[100]; printf("文字列を入力してください:"); scanf("%s", str); str_toupper(str); printf("大文字:%s\n", str); str_tolower(str); printf("小文字:%s\n", str); return(0); } clangを用いてコンパイルすると4warnings generatedと出ます。 ------------------------------------------------------------ ex11-4.c:6:13: note: use '==' to turn this assignment into an equality comparison while(*str = toupper(*str)){ ^ ------------------------------------------------------------- こんなのや ---------------------------------------- ex11-4.c:7:3: warning: expression result unused [-Wunused-value] *str++; ^~~~~~ ---------------------------------------------------- といった警告が表示されます。 どこをどう訂正すれば良いのでしょうか。 よろしくお願いします。

  • C言語に詳しい方お願い致しいます

    文字列Aから文字列Bを除いた結果を表示するプログラムなのですが 一ヶ所分からない部分があります。 #include <stdio.h> #include <string.h> int main(void){  char str1[] = "abcdefg";  char str2[] = "cde";  char str3[128] = "";  char *p1 = str1, *p2;  size_t len;  len = strlen(str2);  while((p2 = strstr(p1,str2)) != NULL) {   strncat(str3,p1,p2 - p1);   p1 = p2 + len;   printf("----\n");   printf("p2=%s\n", p2);   printf("str3=%s\n", str3);   printf("p1=%s\n", p1);  }  strcat(str3,p1);  printf("%s\n",str3);  return 0; } while文中の p1 = p2 + len; なのですが、何故これでp1の内容が「fg」になるのでしょう。

  • 配列とポインタについて

    C言語を独学で始めたばかりの者です。 ポインタのところまでいきましたが、以下のプログラムを配列で書き替えようと思ったのですが、test4ができません。test1から3 までは配列を使って書けました。 #include <stdio.h> main() { char s[10]; char *p; strcpy(s, "ABCDE"); p=s; printf("------test1\n"); printf("s=%s p=%s\n", s, p); printf("------test2\n"); putchar(*p); putchar(*(p+1)); putchar(*(p+2)); putchar('\n'); printf("------test3\n"); *p='m'; *(p+1)='n'; printf("s=%s\n", s); printf("------test4\n"); while(*p) { *p=*p+1; ++p; } printf("s=%s\n", s); } この最後のtest4を配列で書くとどうなるのでしょうか。質問文が長くて申し訳ないのですが、お願いいたします。

  • 文字列を関数に渡すぷろぐらむなのですがおかしいです。

    <ソース> #include<stdio.h> #include<stdlib.h> void str(char a[]); int main() { char st[10]="abcde"; str(st); str("ABCabc123"); return 0; } void str(char a[]) { int i; printf("%s\n",a); i=0; while(a[i]){ a[i]=toupper(a[i]); putchar(a[i]); i++; } putchar('\n'); } 分からないところがあるので質問します。 toupperは、大文字にするんですよね。 putcharは、基本的にchar型でしたっけ? putsとgetsは、int型でしたっけ? 後、プログラムが暴走してます。 どこがおかしいんでしょう?

専門家に質問してみよう