• 締切済み

ポインタとcharについて

文字列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を表示しようとしましたが、できませんでした。 なぜでいきないのか指摘お願いします。 初歩的なことですみません。

みんなの回答

  • NNori
  • ベストアンサー率22% (377/1669)
回答No.8

#7です。 訂正します。 char c ; c = 'A','B','C'; とやると c には 'A' が入ります。どうしてかというとカンマ演算子は、= よりも優先順位が低いからです。 つまり、上の式だと、 ( c = 'A' ) , 'B' , 'C' ; と評価されます。 こんなバカなこと普通はしませんよねぇ。

全文を見る
すると、全ての回答が全文表示されます。
  • NNori
  • ベストアンサー率22% (377/1669)
回答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' が代入されます。

全文を見る
すると、全ての回答が全文表示されます。
  • NNori
  • ベストアンサー率22% (377/1669)
回答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); となります。 もうちょっとですね。

全文を見る
すると、全ての回答が全文表示されます。
  • harawo
  • ベストアンサー率58% (3742/6450)
回答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);」と書けば、「ポインタを使用したコード」ということになります。(そうでなくても、ポインタを使っていることになるけど)

全文を見る
すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.4

おっと、char *s[11]でしたか。だとすると、printfの指摘は間違いで、 > s[11] = 'A','B','C','D','E','F','G',','H','I','J','K'; こっちがおかしい。 a) Cの文法を間違えて覚えている。 b) Cの文字列を理解してない。 c) 単なるケアレスミス。 ――のいずれか、あるいはその全ての可能性が考えられます。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

>s[11] = 'A','B','C','D','E','F','G',','H','I','J','K'; ここでコンパイルエラーが起きてますよね。 どんなエラーメッセージが出ていますか?

roy11
質問者

補足

Microsoft Visual C++ 2010を使ってるのですが「charの値をchar*のエンティティに割り当てることができません」と書かれてあります

全文を見る
すると、全ての回答が全文表示されます。
  • NNori
  • ベストアンサー率22% (377/1669)
回答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 に 代入しているだけです。 これが理解できれば、やりたいことが見えてくるのですが、いかがでしょうか?

roy11
質問者

補足

試に以下のようなものを実行しましたが上手く行きませんでした。何故でしょうか。 char s[11]; strcpy(s,"ABCDEFGHIJ"); char *p; p = &( s[0] ); printf("%s",*p); ちなみに、1と2の違いは理解できたと思います。 上記のようなものができれば、for文とif文で題意のものを作れる気がしますが・・・どうでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> printf("%s",s[i]); ここがおかしい。 a) 書式文字列を間違えて覚えている。 b) Cの文字列を理解していない。 c) たんなるケアレスミス。 ――のいずれか(あるいはそのすべて)の可能性が考えられます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ポインタ

    文字列"apple", "orange", "strawberry"へのポインタをポインタ配列の各要素に代入した後,その文字列の文字を逆順に表示するようにプログラムを考えているのですが、 while文の中のjはそれぞれについて考える必要がありますか? ポインタを使って文字数を数得られそうですが出来ませんでした。 [実行例] ポインタ配列[0]の文字列の逆はelppaです. ポインタ配列[1]の文字列の逆はegnaroです. ポインタ配列[2]の文字列の逆はyrrebwartsです. #include<stdio.h> #define COUNT 3 int main(void) {   char * words[COUNT] = {"apple", "orange", "strawberry"};   int i, j;   for(i = 0; i < COUNT; i++) {    j =  ?  ;    printf("ポインタ配列[%d]の文字列の逆は", i);    while(   ?   ) {     printf("%c", *(words[i] + j));     j--;    }    printf("です.\n");   }   return 0; }

  • char型ポインタ

    よくプログラムで charポインタだけ指定して、 #include<stdio.h> int main(){ char* p; p = "abcdef"; printf("%s",p); return 0; } のようにしているのをみかけますが、 メモリーを確保していなくても問題ないのでしょうか? char* p; p = (char*)malloc(7); strcpy(p,"abcdef"); としたのと同じでしょうか?

  • ポインタ

    #include<stdio.h> int main() { char *p; p="ポインタ"; printf(p); return 0; } なぜ p="ポインタ"; とできるのですか? 普通は  int *i, j; i=&j; *i=100; こんな感じでやるのでは?

  • ポインタのポインタの必要性

    書物によるとポインタのポインタの使用例として「ポインタの配列」はポインタを使ってアクセスすることができます。」[*]とありますが、どうしてポインタのポインタが必要なのかがいまいちピンと来ません。 どういう場合なのかを知りたく思っています。 [*]サンプルスクリプト ===================================================== char *mnthp[3] = {/* ポインタの配列の宣言 */ "January", "February", "March" }; char **p1;/* 「ポインタのポインタ」の宣言 */ int i, j; p1=mnthp;/* 「ポインタのポインタ」にポインタの配列 */ /* の先頭番地を設定 */ /***** 例1 *****/ for (i = 0; i < 3; i++) {/* 「ポインタのポインタ」の値を変えずに */ printf("%s\n", *(p1 + i));/* 相対的に文字列を出力 */ } ==> このようなことをしなくとも printf("%s", mnthp[i]); で値を参照出来ると思われる。 ===================================================== [*] http://www9.plala.or.jp/sgwr-t/c/sec10-4.html 宜しくお願い致します。

  • char (*data)[10] のようなポインタの使い方教えてください

    char (*data)[10]; のようのポインタの使い方がよくわからないので, 詳しい方いたら,教えてください. void main (){ char (*data)[10]; data = ????;//newを使ってメモリを確保したい for (int i = 0; i < ????; i++){ for (int j = 0; j < 10; j++){ data[i][j] = 何かデータ; } } //最終的にはこんな風に使いたいと思っています. } このような感じで new を使ってメモリの領域を確保したいのですが, どうもうまくいきません. data = new char[3]; data = new char*[3]; など,いろいろ試したのですが,だめでした. 使用しているOSはwindowsXPでvisual studio 2005を使ってプログラムをコンパイルしています. わかる方いたら,よろしくお願いします.

  • プログラミング(ポインタ/文字列処理)を教えて下さい

    プログラミング(ポインタ/文字列処理)を教えて下さい 英単語(最大で15文字まで)を*が現れるまで1つずつ読み込み、読みこんだ英単語の文字数を計算して表示するプログラムです。英単語は文字型配列を使用します。 1、関数の引数及びその中の実行文中で配列を使用 2、関数と引数及びその中の実行文中でポインタ変数を使用する この2つのプログラムを別々に作らなければならないのですが、当方関数をの使い方が今一分らないので以下のプログラムを関数での作成方法を教えて下さい。 これが関数で作らなければいけないプログラムです #include<stdio.h> int main(void) { char mojiretu[15]; int con[15]={0},i,j; printf("課題データ\n"); scanf("%s",mojiretu); while(mojiretu[0]!='*') { for(j=0;mojiretu[j]!='\0'j++) {} con[j-1]++; scanf("%s",mojiretu); } printf("文字数\t出現回数\n") for(i=0;i<=14;i++) printf("%d\t%d\n",i+1,con[i]); } こちらはポインタ変数を用いていますが関数になっていません。 #include<stdio.h> int main(void) { char mojiretu[15],*pmoji int con[15]={0},i,j; pmoji=&mojiretu[0]; printf("課題データ\n"); scanf("%s",mojiretu); while(*pmoji!='*') { for(j=0;*(pmoji+j)!='\0'j++) {} con[j-1]++; scanf("%s",mojiretu); } printf("文字数\t出現回数\n") for(i=0;i<=14;i++) printf("%d\t%d\n",i+1,con[i]); } 2つとも正常に動いてます。どちらか一つでもいいので関数での書き方を詳しくおねがいします。

  • 文字を逆転させて表示させるプログラミングなのですが・・・。

    #include<stdio.h> int main() { char moji[80]; char hantai[80]; int i; int j; int n; printf("半角文字列を入力:"); scanf("%s",moji); for(n=0;moji[n]!='\0';n++); for(i=n-1,j=0,i>=0;i++;j--){ hantai[j]=moji[i]; } hantai[j]='\0'; printf("反対から:%s\n",hantai); return 0; } 反対からが表示されません。 考えたのですがわかりません。

  • charのポインタについて

    同じような質問ばっかりたて続けにしてしまってすみません・・ あの,以下のような例の時↓ ------ { char array[7]; char *ptr; strcpy(array, "abcdef"); ptr = &(array[0]); printf(" array = %s\n ptr = %s\n", array, ptr); } ------ これを実行したら、 array = abcdef ptr = abcdef となりますが、ポインタとして宣言してるptrから文字列を得たい時は *ptr と書くんではないのでしょうか? %s のように出力形式のところを指定をするだけで 文字列で表示してくれるのはなぜですか? 上の例のように書くのが正しいのでしょうか

  • プログラミングのポインタの所の課題で、途中までやったのですが・・・

    プログラミングのポインタの所の課題で、途中までやったのですが・・・ どうしてもとけません。どなたか解けるかた、ご指導お願いします。。。 課題は以下の通りです。 1.文字配列の先頭文字でソートを行って出力するプログラムを完成させよ。ただし、my_sort_stringsはポインタ配列とその要素数を引数として、登録されている文字配列を昇順に並べ替える関数である。 #include<stdio.h> #include<string.h> void print_strings(char **p, int n); void swap_strings(char **p, int i, int j); int min_index(); void my_sort_strings(); int main() { char*p[100]; char Orange[] = "orange"; char Apple[] = "apple"; char Peach[] = "peach"; char Grape[] = "grape"; char Melon[] = "melon"; int i; p[0] = Orange; p[1] = Apple; p[2] = Peach; p[3] = Grape; p[4] = Melon; print_strings(p, 5); my_sort_strings(); print_strings(p, 5); return 0; } void print_strings(char **s, int n) { int i; printf("-----------begin: print_string ----------\n"); printf("print_string: s's value: %08x\n", s); for(i = 0; i < n; i++) { printf("(s[%d])'s value: %08x\n", i, s[i]); printf("(s[%d])'s address: %08x\n", i, &s[i]); } for(i = 0; i < n; i++) printf("%d: %s\n, i, s[i]"); printf("-----------end: print_strings-----------\n"); } void swap_strings(char **p, int i, int j) { char *tmp; tmp = p[i]; p[i] = p[j]; p[j] = tmp; } int min_index(char **a, int n) { } void my_sort_strings( ) { } 2.課題1を元に文字配列の2文字目以降の順序まで考慮した辞書式順序でソートを行うプログラムを作成せよ。関数名はlexicographic_sortとする。

  • ポインタについて

    #include<stdio.h> int main(void){ int i; char *pt = "Hello World"; char a[11]; pt = &a; for(i=0;i<=11;i++){ printf("%c %x\n",pt,&a[i]); pt++; } return(0); } H abcd80(←アドレス) E abcd81(←アドレス) のように表示したいんですが、アドレスだけうまくできてHELLO WORLD のほうがうまく表示できません。 夏休みの間ブランク空けたんでポインタ全て抜けてしまったみたいです^^;  よろしくおねがいします。