こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ポインタの基本的な問題

ポインタの勉強をしています。変数にポインタが付いている場合の動作は大体理解したつもりですが以下のように関数にポインタが付いているとどう扱えばいいのかわかりません。とりあえず、まずは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];
}

投稿日時 - 2008-07-26 08:52:05

QNo.4204724

暇なときに回答ください

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

下のようにすると、エラーは出ません(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月」と表示させる
}
注:インデントに全角空白を用いています。タブに一括変換して下さい。

投稿日時 - 2008-07-26 10:24:10

お礼

ご回答有り難うございました。

投稿日時 - 2008-07-26 13:07:31

このQ&Aは役に立ちましたか?

26人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

 まず,コンパイラのエラーメッセージをよく読みましょう。5行目で代入不可能と言ってますよ(gccの場合)。

  s = tsukinonamae(n);

の左辺の s は配列名ですから定数であり,代入できません。文字列をコピーしたいのなら,他の皆さんがおっしゃるとおり strcpy 関数や strncpy 関数を使います。また,

#include <stdio.h> /* printf用 */
#include <string.h> /* strcpy, strncpy用 */

を書く習慣をつけておいたほうがいいでしょう(上記のコメントを付ける必要はありません)。

 ポインタの学習と同時に配列の復習もしてください。似ている点と違っている点。

 がんばってください。

投稿日時 - 2008-07-26 10:57:25

お礼

ご回答有り難うございました。

投稿日時 - 2008-07-26 13:06:53

ANo.2

>それすらコンパイルエラーになります。
コンパイルエラーがなにを言っているのかをまずよく読みましょう。

>nam[1]に入っているjanという文字列をchar型で返す?と思う

いいえ、tsukinonamae() は文字列 "jan" の先頭アドレス(char* 型)を戻しています。

それを印字したいだけなら printf("%s\n", tsukinonamae(1)) とするか、
char s[30] に strncpy() などで内容をコピーしてから印字しましょう。

投稿日時 - 2008-07-26 09:47:18

お礼

ご回答有り難うございました。

投稿日時 - 2008-07-26 13:07:59

ANo.1

char s[30];

char* s;
にすればエラーはでなくなると思います
もしくは
s = tsukinonamae(n);

strcpy(s, tsukinonamae(n));
に変更

ポインタと配列は似てるところもありますが違うものです

投稿日時 - 2008-07-26 09:18:50

お礼

ご回答有り難うございました。

投稿日時 - 2008-07-26 13:08:21

あなたにオススメの質問