- ベストアンサー
文字列の問題
入力された文字列(char型配列に格納)について、1文字ずつその文字の種類を表示し、最後に文字数を表示するプログラムを作成せよ。文字の種類は、大文字、小文字、数字、その他の文字の4種類とすること。 という問題なのですが、実行例は↓になっています。 % ./mojiretsu 文字列(20文字まで)? Char-1 ←文字列を入力 1文字目は C で、 大文字です。 2文字目は h で、 小文字です。 3文字目は a で、 小文字です。 4文字目は r で、 小文字です。 5文字目は - で、 その他の文字です。 6文字目は 1 で、 数字です。 以上6文字です。 % ですが↓から先をどう書いたら良いのかわかりません。どなたか教えてください。 #include<stdio.h> main() { char ch[20]; printf("文字列(20文字まで)? "); scanf("%s", ch);
- nadonado
- お礼率43% (19/44)
- C・C++・C#
- 回答数3
- ありがとう数11
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>「大文字かどうか」「小文字かどうか」などの判定はよく分かりません。 http://www.bohyoh.com/CandCPP/C/Library/index.html ここの I の部分は全て、「文字種テスト関数」のようです(未確認)。 >for(i=0;ch[i] != '0';i++){ '0' は、数字の 0 で16進の 0x30。文字列終端は、0x00 です。 http://e-words.jp/p/r-ascii.html >for(j=1;j<=20;j++){ 前の for 文と合体した意味合い?でないと・・・。 ------------------------ ☆ else の嫌いな年寄りの一例です(BorlandC++5.6.4)。 #include <stdio.h> #include <ctype.h> // 文字種テスト関数ヘッダファイル char cgMojisyu[4][16] = { "数", "大文", "小文", "その他の文" }; void main() { char ch[32]; int iCode, nn = 0; printf( "文字列(20文字まで)? " ); scanf( "%s", ch ); while( ch[ nn ] && ( nn < 20 ) ){ // 終端でなく、かつ、< 20 iCode = 3; // 一旦、「その他の文字」 if( isdigit( ch[ nn ] ) ) iCode = 0; if( isupper( ch[ nn ] ) ) iCode = 1; if( islower( ch[ nn ] ) ) iCode = 2; printf( "%2d文字目は %c で、%s字です。\n", ( nn + 1 ), ch[ nn ], cgMojisyu[ iCode ] ); nn++; // 次の文字へ } printf( "以上 %d 文字です。\n", nn ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。
その他の回答 (2)
- ryopis
- ベストアンサー率20% (49/238)
for(もしくはwhile)を使って配列chの各要素(ch[0],ch[1],...)を 調べていくことになりますが、そのあたりの構文はわかりますか? ちなみにこのループを抜ける条件はNULL文字です(以下参照)。 20文字の文字列を受け付けたい場合は char ch[21]; などと(最低)21文字分の配列を用意しておきましょう。 #C言語ではNULL文字という文字で文字列が終わります。
お礼
アドバイスありがとうございました。なんとかできました。
- Tacosan
- ベストアンサー率23% (3656/15482)
「大文字かどうか」「小文字かどうか」などの判定はできますか? 大文字かどうかなどの部分を除いて 1文字目は C です 2文字目は h です などと表示することはできますか?
お礼
作成できました、ありがとうございました。
補足
「大文字かどうか」「小文字かどうか」などの判定はよく分かりません。 ↓で 1文字目は C です。 2文字目は h です。 などと表示することはこれでよいのでしょうか? #include<stdio.h> main() { char ch[21]; int i; printf("文字列(20文字まで)? "); scanf("%s", ch); for(i=0;ch[i] != '0';i++){ for(j=1;j<=20;j++){ printf("%d文字目は %c です。", j,ch); } } }
関連するQ&A
- 文字列の入れ替え
2つのchar型配列x[],y[]に格納された文字列を入れ替えるプログラムを作成せよ。ただし入替え処理には、関数swap_array(char [],char [])を作成して用いること。という問題なのですが、下記の実行例では、2つの文字列xとyをキーボードから入力し、入れ替えた後に表示している。 <実行例> % ./irekae 文字列x (20字まで)? Mojiretsu 文字列y (20字まで)? Irekae 関数swap_array()を呼び出しました 入替後の x: "Irekae" 入替後の y: "Mojiretsu" % となっているのですが文字列を格納するところまでしかわかりません。 どなたか教えていただけないでしょうか? #include<stdio.h> int main(void) { char x[21]; char y[21]; printf("文字列 (20字まで)? "); scanf("%s", x); printf("文字列 (20字まで)? "); scanf("%s", y);
- 締切済み
- C・C++・C#
- 文字列のコピー
C言語で、文字列をコピーする関数で、処理が止まってしまいます。 以下が実行したプログラムです。 #include<stdio.h> #include<string.h> void copy(char *str2 ,char *str3){ strcpy(str2,str3); } void input(char* str){ scanf("%s",str); } int main (void){ char *a; char *b="TEST"; printf("%s\n",b); input(a); copy(b,a); printf("%s",b); return(0);} copy(b,a);で処理が止まってしまいます。入力した文字列を表示できるように、御指摘お願いします。
- 締切済み
- 情報工学
- 文字列を大文字にするプログラムがわかりません。
小文字を大文字に、大文字はそのまま、それ以外は表示しないプログラムなんですが、 「それ以外を表示しない」というところが書けません。 #include <stdio.h> int main(void) { char x; char *p; puts("文字列を入力"); scanf("%s", &n); for(p = &n; *p != '\0'; p++){ if(*p >= 'a' && *p <= 'z'){ *p = *p - 'a' + 'A'; } } printf("%s\n", &n); return 0; } これではもちろん数字などはそのまま表示されてしまいます。 しかも、4文字までは普通に大文字で表示されるんですが 6文字だとcoredumpedしてしまいます。 すいませんが、ソース書いて教えていただけると嬉しいです。
- ベストアンサー
- C・C++・C#
- 文字列をa→1b→2...z→26に変換する
文字列を上記のように変換して表示するプログラムについて #include<stdio.h> int main() { char ch[10]; printf("小文字のアルファベットの文字列を入力\n"); scanf("%s",&ch); int i=0,j=97; while(ch[i]!='\0'){ for(j; j<=97+26; j++){ if(ch[i]==j){ ch[i]=j-96; printf("%d\n",ch[i]); } } i++; } return 0; } 一文字の場合は問題ないのですが複数になるとうまくいきません 実行例 a 1 hello 8 となってしまいます。 改善をお願いします。
- 締切済み
- 情報工学
- 文字列をint型へ変換するには?
c言語初心者です。 こちらのプログラムだとうまく表示されません何故でしょう? わかる方是非教えていただきたいと思います。 #include<stdio.h> #include <stdlib.h> int main() { int num ; char sum1[4]; printf("数字 str1 =>"); scanf("%d",&num); num= atoi(sum11); printf("sum1= [%d]\n",num); } コマンドに数字を入力したあとintに変換してnumに表示させたいのですが、、、、
- ベストアンサー
- C・C++・C#
- 文字列の探索
ファイル名を指定して文字列の探索を行うというプログラムをC言語で作成したのですが、 コンパイルのときに警告で「問題のあるポインタの変換(関数 main )」と出て、うまい具合に動きません。改良点を教えてください。 #include<stdio.h> #include<string.h> #include<stdlib.h> unsigned char *s1; unsigned char *s2; unsigned char *cp; FILE *fp; char fname[64]; void TestStrStr(void); main(){ s1 = calloc(256, sizeof(unsigned char)); s2 = calloc(256, sizeof(unsigned char)); printf("Input Filename..."); scanf("%s",fname); while(1){ fp = fopen(fname, "r"); if(fp == NULL){ printf("ファイルを開くことができません...\n"); printf("Input Filename..."); scanf("%s",fname); }else break; } s1=fp; // printf("文字列1を入力してください:"); // scanf("%s",s1); printf("文字列2を入力してください:"); scanf("%s",s2); TestStrStr(); return 0; } void TestStrStr(void){ cp = strstr(s1, s2); if(cp == NULL) printf("'%s'に'%s'のいずれの文字も含まれない.\n", s1, s2); else printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1); free(s1); free(s2); }
- ベストアンサー
- C・C++・C#
- 文字列の検索
プログラミングの勉強の際に下のプログラムを作りました。 最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 コンパイルは通るのですが、文字列を2つ入力すると 「セグメンテーション違反です」と表記されます… どこが悪いのでしょうか? どなたか解説・指摘・模範解答などおねがいします。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(*c!='\0'){ c=a; d=b; while(*c!='\0' && *d!='\0') if(*c!=*d) printf("0"); break; c++; d++; } if(*d='\0') printf("1"); a++; return a; return NULL; }
- ベストアンサー
- C・C++・C#
- c言語のポインタへの文字列入力についてです。
当方c言語初学者なのですがscanfを使ってポインタに文字列を入力したいのですがバグが発生して進みません・・・どういうことなのでしょうか? #include <stdio.h> int main(void) { char *a; scanf("%s", a); printf("%s", a); return (0); } *aをa[128]; のように配列に変えるとうまくいくことはなんとかわかるのですが・・・助けてください(^_^;)
- ベストアンサー
- C・C++・C#
お礼
丁寧な回答ありがとうございました。参考になりました。おかげさまで作成できました。