• 締切済み

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

どなたか文字列をポインタに入れる方法を教えてください。下のプログラムの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; }

みんなの回答

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

>どなたか文字列をポインタに入れる方法を教えてください。  う~ん、「ポインタに入れる」とはなんだろう。  質問主旨は、「配列」は判ったから「ポインタ」を勉強してみよう、ということかな。  というか、示された関数2つ、「配列」の面影残しすぎ・・。  てか、void reverse() は、「配列」でないと・・「戻り値」はないのだから。 ☆「配列」で自分の思うことが(十分簡単に)実現できると判ったなら、それで十分と思うけど・・。   int count( char name1[] )   {      int i;      for( i = 0; i < 80; i++ ){        if( '\0' == name1[i] )  break;      }      return( i - 1 ); // 「空白は文字数に含めない」   } または、   int count( char name1[] )   {      return( strlen( name1 ) - 1 );   } -------------------------------------------- >下のプログラムの a=count(name1); と reverse(name1,name2,a); のとこにエラーが表示されます。  そこに「エラーがある」から「エラーが表示され」た訳ではないと思います。  コンパイラは、ソースの頭から解釈していって、前方で定義された関数の「形式」と、ソースの後方にあった当該関数の「呼び出し方」が合わないから、(「合わない」と判った所で)エラーを表示した、だけだと思います。  (エラー:警告を含めた広義のエラー)  質問者様のソースでは、    int count( char *name1[] ) とした関数を、(ソース後方 main で)a = count( name1 ); と呼び出している。    ↑コンパイラは、ソースの前方にあるものを正しいとする(しかない)から、ありゃりゃ???、なんでこんな呼び出し方すんのと・・。 -------------------------------------------- gets() が「読み取った改行文字は捨て」るので、gets() を使わずに(今回の本質でない)、ソースを書いて(BorlandC++5.6.4)みました。  http://www.bohyoh.com/CandCPP/C/Library/gets.html #include <stdio.h> int count( char *name1 ) {  int b = 0;  while( *name1 ){ // 「文字」がヌルでない間ループ   b++;   name1++; // char 型なので1バイト次へ  }  return( b ); // 途中の空白1文字も「処理」に必要◆ } void reverse( char name1[], char name2[], int a ) {  int w;  for( w = 0; w < a; w++ ){ // 途中の空白1文字分も◆   name2[ w ] = name1[ a - w - 1 ];  }  name2[ w ] = 0x00; } void main() {  char name1[80] = "yamada hirosi", name2[80];  int a;  a = count( name1 );  printf( "%s\n", name1 );  printf( "空白を除く文字数は %d\n", ( a - 1 ) ); // 「空白は文字数に含めない」  reverse( name1, name2, a );  printf( "逆順にした後は %s\n", name2 ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

>整数の場合は&を入れたらできるみたいですが、文字列となるとやり方が違うのでしょうか? 単にエラーが出なくなっただけで、問題は解決できていないと思われる。 エラーメッセージのとおり。渡し型が違っている。 count()と、reverse()の作り方に問題がある。 引数を「char *name1[]」としている理由は? ちなみに、正常に動くように変更した場合でも、ソースに一部間違いがあるので注意。

関連するQ&A