- ベストアンサー
ポインタの基本的な問題
ポインタの勉強をしています。変数にポインタが付いている場合の動作は大体理解したつもりですが以下のように関数にポインタが付いているとどう扱えばいいのかわかりません。とりあえず、まずはtsukinonamae関数にinteger 1を渡して「1月」と表示させることから始めようとしていますが、それすらコンパイルエラーになります。引数nに1を渡すところはいいですよね?その後、nam[1]に入っているjanという文字列をchar型で返す?と思うのでメイン部で宣言したcharに渡そうとしているのですが。。 何が問題なのでしょうか。 char *tsukinonamae(int n); int main(){ int n = 1; char s[30]; s = tsukinonamae(n); printf("%s\n", s); } char *tsukinonamae(int n){ static char *nam[] = { "none", "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"}; return (n<1 || n>12) ? nam[0] : nam[n]; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
下のようにすると、エラーは出ません(BorlandC++5.6.4) #include <stdio.h> char *tsukinonamae( int n ) { static char nam[13][8] = { "none", // 単独行 "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" }; return( ( n < 1 || n > 12 ) ? nam[ 0 ] : nam[ n ] ); } void main() { int n = 1; char *s; s = tsukinonamae( n ); printf( "%s\n", s ); printf( "%c%c月\n", 0x82, ( 0x4F + n ) ); // 「1月」と表示させる } 注:インデントに全角空白を用いています。タブに一括変換して下さい。
その他の回答 (3)
- Ebling_Mis
- ベストアンサー率28% (4/14)
まず,コンパイラのエラーメッセージをよく読みましょう。5行目で代入不可能と言ってますよ(gccの場合)。 s = tsukinonamae(n); の左辺の s は配列名ですから定数であり,代入できません。文字列をコピーしたいのなら,他の皆さんがおっしゃるとおり strcpy 関数や strncpy 関数を使います。また, #include <stdio.h> /* printf用 */ #include <string.h> /* strcpy, strncpy用 */ を書く習慣をつけておいたほうがいいでしょう(上記のコメントを付ける必要はありません)。 ポインタの学習と同時に配列の復習もしてください。似ている点と違っている点。 がんばってください。
お礼
ご回答有り難うございました。
- koko_u_
- ベストアンサー率18% (459/2509)
>それすらコンパイルエラーになります。 コンパイルエラーがなにを言っているのかをまずよく読みましょう。 >nam[1]に入っているjanという文字列をchar型で返す?と思う いいえ、tsukinonamae() は文字列 "jan" の先頭アドレス(char* 型)を戻しています。 それを印字したいだけなら printf("%s\n", tsukinonamae(1)) とするか、 char s[30] に strncpy() などで内容をコピーしてから印字しましょう。
お礼
ご回答有り難うございました。
- php504
- ベストアンサー率42% (926/2160)
char s[30]; を char* s; にすればエラーはでなくなると思います もしくは s = tsukinonamae(n); を strcpy(s, tsukinonamae(n)); に変更 ポインタと配列は似てるところもありますが違うものです
お礼
ご回答有り難うございました。
お礼
ご回答有り難うございました。