ポインタと文字列の問題について

このQ&Aのポイント
  • ポインタと文字列の問題について質問です。a~z,A~Z及び,.?空白などで構成される文字列を入力して、大文字と小文字を区別しないでa~zの出現頻度をポインタを使ってそれぞれ表す方法を教えてください。
  • 質問者はポインタを使ってプログラムを作成しましたが、実行結果が正しくありません。実行結果を修正する方法を教えてください。
  • 質問者のプログラムは、文字列から大文字を小文字に変換していますが、その部分が正しくありません。修正して正しい結果を得る方法を教えてください。
回答を見る
  • ベストアンサー

ポインタと文字列

最近やっとポインタを理解できるようになってしきました。 でも、ちょっとわからない問題があるので質問させていただきます。 問)a~z,A~Z及び,.?空白などで構成される文字列を入力して、大文字と小文字を区別しないでa~zの出現頻度をポインタを使ってそれぞれ表しなさい。 ※文字列のほうはこちらで用意させていただきました。リダイレクトを使用してください。単語数は250です。 http://ayumuatsuco.fc2web.com/mit.htm 一応途中まで作ってある私のプログラムを参考にしてみてください。実行結果が変ですが。。。 #include <stdio.h> int main(void) { char buffer[250], hindo[26], *p; int i; while(1){ if(gets(buffer)==NULL) break; p=buffer; while(*p!='\0'){ hindo[*p-'a']++; for(i=0; i<10; i++){ if('a'<=*(p+i)) *(p+i)=*(p+i)-32 } for(i=0; i<26; i++){ printf("hindo[%d]=%d\n",i,*(p+i)); } } } return 0; }

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

  • ベストアンサー
  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.1

とりあえず書いてみました。比較してみてください。 (尚、F=40 → F=49 が正しいのではないでしょうか?) #include <stdio.h> int main(void) { char buffer[250+1], *p; int hindo[26], i; for(i = 0; i < 26; i++) hindo[i] = 0; while(1){ if(gets(buffer)==NULL) break; for(p=buffer; *p!='\0'; p++){ if(('a' <= *p) && (*p <= 'z')) *p -= 0x20; if(('A' <= *p) && (*p <= 'Z')) hindo[*p-'A']++; } } for(i=0; i<26; i++){ printf("%c=%d\n",'A'+i,hindo[i]); } exit(0); }

osiato
質問者

お礼

即レスありがとうございます。 F=49が正しかったみたいです。 間違っていてすみませんでした。 MovingWalkさんのやり方でやってみたところ出来ました。 回答ありがとうございました。

関連する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; }

  • C言語のポインタについて教えてください。

    C言語のポインタについて教えてください。 ・pointer1.c  int main(){   int a;   int *p;   p = &a;     a = 123;   printf("%d", *p);   return 0;  } ・pointer2.c   int main(){ int a[100]; int *p; p = &a[0]; int i; for(i = 0; i < 100; i++) a[i] = i; for(i = 0; i < 100; i++) printf("%d", *p++); return 0; } と二つのソースコードがあるとき、pointer2.cの「p = &a[0]」をpointer1.cのように「p = &a」と書けないのはなぜですか?  また、「&a」は動かすことのできなく、「aを指し示す*p」は動かすことができる変数のようなもの、という認識に誤りはないでしょうか?  宜しくお願いします。

  • 二次元文字列をポインタで操作するには

    お世話になります、フジと申します。今回皆様にお聞きしたいことは、かなり基本的な部分なのですがどうしても理解できず質問させて頂きます。 まず以下のようなプログラムを作成しました。 char *data[10]; void func(char* d) { static int i=0; data[i] = d; i++; } int main(void) { int i = 0; char a[10]; while(1){ if(i>2)break; if(i==0) strcpy(a,"Hello"); if(i==1) strcpy(a,"Morning"); if(i==2) strcpy(a,"Night"); func(a); i++; } i = 0; while(1){ if(i>2)break; printf("data is %s\n",data[i]); i++; } return 0; } すると出力されるdata[]の値は全て"Night"になります。これはポインタを使っているから当たり前だと思います。 これをどうにしかして上のようにポインタを用いて, data is Hello data is Morning data is Evening と出力させることが出来ないでしょうか? 大変基本的な部分とは思いますが、宜しくお願い致します。

  • ポインタ スペースを数えるプログラム

    入力した文章のスペースを数えるプログラムを作ってみました. ポインタをまだしっかり理解していないのですが,ポインタを使用 する場合,以下のようなプログラムで正しいですか? (オーバーフローなどについては対処していません.) #include<stdio.h> int main(void) { char str[80],*p; int i,count=0; gets(str); p=str; for(i=0;i<80;i++) { if(p[i]==' ') { count++; } } printf("%d",count); return 0; }

  • 文字列から空白を取り除きたいのですが

    C言語を勉強しはじめて間もない者です。 文字列から空白を取り除く(空白は左に詰めることで埋める)処理をしたいのですが、下記のようなやり方でうまくできなくて困っています。 ↓を実行すると" 1234"なら"12344"になるはずだったのですが、うまくいきません。何がおかしいのでしょうか?? よろしければご教授願います。 ※文字列は半角のみ想定しています。 int i = 0; char str[] = " 1 23 4 5"; char *p; p = str;   while( *p != '\0' ){     if ( isspace(*p) != 0 ){       while( *(p + i + 1) != '\0' ){         *(p + i) = *(p + i + 1);         i++;       }     }     p++;   }  

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

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

  • 文字列ポインタの配列の扱い方

    毎度お世話になります。 構造体のメンバが、文字列ポインタの配列だった場合、それに文字列をコピーすることは可能なのでしょうか? とりあえず下記のように書いてみたのですが、実行エラーで終了してしまいます。 typedef struct data{ char name[30]; int age; char *ss[2]; }DATA; int main() { DATA dt[3] = {{"AA",10}, //ssも初期化出来るのか? {"BB",15}, {"CC",20}}; int i,j; for(i=0;i<3;i++){ for(j=0;j<2;j++) strcpy(dt[i].ss[j],"なし"); //それとも、ここでstrcpyで文字列を入れるのか? } よろしくお願いします。

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

    プログラミング(ポインタ/文字列処理)を教えて下さい 英単語(最大で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つとも正常に動いてます。どちらか一つでもいいので関数での書き方を詳しくおねがいします。

  • ポインタ文字列をchar[ ]の文字列へ変換する方法

    C言語の問題で悩んでいます。 ポインタ型で受け取った文字列を、通常の配列に変換し、それぞれの文字列がいくつ使われているというプログラムを組みたいのですが、うまくいきません。 とりあえずここまでのソースを。 #include <stdio.h> int count[95]={0}; void Countx(void){ int x; for(x=0;x<=95;x++){ if(count[x]!=0){ printf("'%c': %d\n",x+32,count[x]); } } } void County(char *str){ int c; for(c=0;c<=20;c++){ count[c+32]=str[c]; } } int main(void){ County("I am a BILL."); Counxt(); return 0; } "I am a BILL"の部分が以下のように ' ':3 '.':1 'a':2 というふうにそれぞれの文字と、利用された回数を出すようにプログラムを組みたいのですが、上記のままだとが ' ':84 '!':104 '"':105 と言う風に、文字コードが空白から順番に、右の回数の部分はなぞの数字が表示されてしまいます。 どうか理想どおりの結果が出るようにする方法を教えてください。 よろしくお願いします。

  • 配列とポインタを使って特定の文字だけ大文字にする

    配列とポインタを使って特定の文字だけ大文字にするプログラムを作りたいのですがどのように作ればいいのでしょうか? 例えば、sportsのsだけ判別してSportSというふうにしたいです。 一応以下のようなプログラムを作ったのですが、実行してもsportsのままで何も変わりません・・・。 #include<stdio.h> void mojihenkan(char *); main(void) { char moji[8]={"sports"}; char *p; int i; mojihenkan(moji); p=moji; for(i=0;i<8;i++){ printf("%c",*(p+i)); } return 0; } void mojihenkan(char *a) { int i; for(i=0;i<8;i++){ if(*(a+i)=='s'){ a-32; } } }

専門家に質問してみよう