文字列ABCDEFGHIJKとあり、それを以下のように表示させるプログラミングを考えています。
ABCDEFGHIJK 全部表示
ACEGIK 1個とばして表示
ADGJ 2個とばして表示
このときポインタを使用することが条件です。
自分は
char *s[11];
s[11] = 'A','B','C','D','E','F','G',','H','I','J','K';
int i;
for(i=0; i<11; i++)
{
printf("%s",s[i]);
}
これでABCDEFGHIJKを表示しようとしましたが、できませんでした。
なぜでいきないのか指摘お願いします。
初歩的なことですみません。
A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
#7です。
訂正します。
char c ;
c = 'A','B','C';
とやると c には 'A' が入ります。どうしてかというとカンマ演算子は、= よりも優先順位が低いからです。
つまり、上の式だと、 ( c = 'A' ) , 'B' , 'C' ;
と評価されます。
こんなバカなこと普通はしませんよねぇ。
No.7
- 回答日時:
余談ですが、
char s[11];
s[11] = 'A','B','C','D','E','F','G','H','I','J','K';
これって、どこが間違いかわかりますか?
char s[11] で定義される配列は、0 から 10 までの 11 個分の配列です。
したがって、 s[11] には代入できません。
これは、実行時エラーでコンパイルエラーにはなりません。
そして、問題は右辺です。
'A' とかは、A という1バイト文字の定数です。
まぁ、数字のようなものです。
そして多くの人が忘れているのがカンマです。これはカンマ演算子というやつです。
なので、右辺はエラーにはなりません。
カンマ演算子は、左から右に評価され、カンマ演算子の返値は後の式の結果になります。
つまり、
'A','B','C','D','E','F','G','H','I','J','K'
という式は 'K' を返します。
char c;
c = 'A','B','C','D','E','F','G','H','I','J','K';
とやると、 c には 'K' が代入されます。
No.6
- 回答日時:
試に以下のようなものを実行しましたが上手く行きませんでした。
何故でしょうか。char s[11];
strcpy(s,"ABCDEFGHIJ");
char *p;
p = &( s[0] );
printf("%s",*p);
ちなみに、1と2の違いは理解できたと思います。
====
*p だと s[0] のことになりますので、printf したければ
printf("%c",*p);
となります。この場合 A がprint できるはずです。
文字列として ABCDEFGHIJ を print したければ、
printf("%s",p);
となります。
もうちょっとですね。
No.5
- 回答日時:
> このときポインタを使用することが条件です。
なぜ、それが条件なのか?その必然性を説明するのが、最初でしょう。
そういう縛りがなければ、コード自体はきわめてかんたんです。
char s[] = "ABCDEFGHIJK";
int i;
char b;
for (i = 0; i < 11; i++)
// for (i = 0; i < 11; i += 2) 1個とばし
// for (i = 0; i < 11; i += 3) 2個とばし
{
b = s[i]; // (A)
printf("%c", b);
}
printf("\n");
配列を扱うということは、そのままポインタを扱うことだということです。
「s[]」に対して、「s」は、配列の最初の要素のアドレスを示すポインタです。
なので、「*(s + 1)」は、「s[1]」と同じ意味になり、「s +1」は2番目の要素のアドレスを示すポインタで、「*(s + 1)」は2番目の要素になります。
上のコードの、(A)を、「b = *(s + i);」と書けば、「ポインタを使用したコード」ということになります。(そうでなくても、ポインタを使っていることになるけど)
No.4
- 回答日時:
おっと、char *s[11]でしたか。
だとすると、printfの指摘は間違いで、> s[11] = 'A','B','C','D','E','F','G',','H','I','J','K';
こっちがおかしい。
a) Cの文法を間違えて覚えている。
b) Cの文字列を理解してない。
c) 単なるケアレスミス。
――のいずれか、あるいはその全ての可能性が考えられます。
No.2
- 回答日時:
char *s[11];
これは、char 型をポイントすることができる変数を11個の配列でとります。
題意からポインター型の配列は必要ないことに気づきましたか?
まず、文字列 ABCDEFGHIJ というのを文字列で代入することを考えます。
1.文字列変数を用意して代入する
変数の宣言は、文字型の配列である必要があります。
char s[11];
strcpy( s , "ABCDEFGHIJ");
こうすると文字型配列 s の s[0]に A,s[1]にB が代入されます。
2.文字列をメモリ上のいずれかに用意させてポインタだけ持つ
char *s = "ABCDEFGHIJ";
こうするとメモリ上のいずれかに ABCDEFGHIJ\0 がとられて一番初めのアドレスが 変数 s に代入されます。
まず1と2の違いを理解してください。
そしてそれぞれ文字列の先頭を示すアドレスを取り出したい場合は次のようになります。
char *po;
1の場合
po = &( s[0] );
これは、s[0] は char 型ですので、そのアドレスを取り出しています。
または po = s;
これは、配列のくせに[]をつけないと 自動的に その先頭アドレスを返すという文法をつかっています。
2の場合
po = s;
これは、1の場合と異なり、sという変数の値を po に 代入しているだけです。
これが理解できれば、やりたいことが見えてくるのですが、いかがでしょうか?
この回答への補足
試に以下のようなものを実行しましたが上手く行きませんでした。何故でしょうか。
char s[11];
strcpy(s,"ABCDEFGHIJ");
char *p;
p = &( s[0] );
printf("%s",*p);
ちなみに、1と2の違いは理解できたと思います。
上記のようなものができれば、for文とif文で題意のものを作れる気がしますが・・・どうでしょうか?
No.1
- 回答日時:
> printf("%s",s[i]);
ここがおかしい。
a) 書式文字列を間違えて覚えている。
b) Cの文字列を理解していない。
c) たんなるケアレスミス。
――のいずれか(あるいはそのすべて)の可能性が考えられます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列内の数字削除
-
SetWindowTextについて。
-
構造体が戻り値の関数について...
-
WM_CHAR or WM_KEYDOWN の「wPa...
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
new charとnew char[N]の違いは?
-
文字列str内の全ての数字を...
-
C言語において、以下の条件で...
-
strcat関数を自作したいです
-
ポインタを使用 [数字列を数値...
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
C言語で文字列をかえす正しい書...
-
文字の代入とコピーについて
-
小数点入りの文字列をfloat型に...
-
callocについて
-
'\\0'とはなんですか?
-
p = (char **)*p の意味
-
C言語を用いた環境変数の作成/...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報