- ベストアンサー
C言語でコマンドライン引数を使用した英小文字個数のカウント
Oh-Orangeの回答
★基本ですのでネットで調べても多分見つかりませんよ。 ・もう既に場所は分かっていますね。 >範囲外アクセスで >int count[26] と宣言しておきながら >for(countmoji = 0x61; countmoji <= 0x7a;countmoji++) > count[countmoji] = 0; >} この場所の1箇所を編集します。 間違い⇒count[countmoji] = 0; 正しい⇒count[countmoji - 0x61] = 0; とします。あと同様に参照部分の 間違い⇒count[countmoji] 正しい⇒count[countmoji - 0x61] とします。 ・単純に 0x61 を変数 countmoji から引くだけでシフトして宣言した count[0] ~ count[25] の範囲に収まります。 その他: ・0x61、0x7a は文字定数のはずですから 0x61⇒'a' 0x7a⇒'z' と分かりやすく記述します。16進数でもよいが意味が分かるようにすべきです。 ・それと while 文の最初に i=0 としていて while 文の内部で i++ しているので for 文で 書き直した方が見やすい気がしますよ。 for ( i = 0 ; argv[1][i] != '\0' ; i++ ){ countmoji = argv[1][i]; count[countmoji - 'a']++; ←0x61(a)をここでも引きます。 } ・もう一つ printf 関数の書式制御文字で %C は何でしょうか。 文字指定では %c の小文字ですが、Linux Fedora Core 6 の拡張指定ですかね。確認を。 最後に: ・『間違えて締め切ってしまいました。』…締め切るときにそのめー時をよく読んでから 操作を進めて下さい。3ステップあるのでそうめったに間違わないと思いますけど…。 ・あっ、onarav さんは今日登録したのですか。このQ&Aの利用方法(ルール)をもう一度 確認などをして下さい。→下の『参考URL』をどうぞ。 ・以上。参考に! 参考質問: ・http://oshiete1.goo.ne.jp/qa2891826.html→『コマンドラインに入力されている文字列の1文字を出力』 ・http://oshiete1.goo.ne.jp/qa2947615.html→『コマンドとコマンドラインとコマンドラインオプションの違いを教えてください。』
関連するQ&A
- 英小文字個数のカウントについて(C)
はじめまして。 勉強中の初心者です。 みなさんの質問に対し、すぐに詳しい方々が親切な回答をされている為、 よく閲覧させていただいております。 #include <stdio.h> int main(int argc, char *argv[]) { char countmoji; int count[26], i; if ((argc == 1)||(argc > 2)) { printf("Usage : ALFSCH <strring>\n\n"); exit(0); } for (countmoji = 0x61; countmoji <= 0x7a; countmoji++) { count[countmoji] = 0; } i=0; while (argv[1][i] != '\0') { countmoji = argv[1][i]; count[countmoji]++; i++; } for(countmoji = 0x61; countmoji <= 0x7a;countmoji++) { if (count[countmoji] >= 1) { printf("%C :%4d \n", countmoji, count[countmoji]); } } return 0; } 上司からだされた練習用課題の一部です。 上記のソースで正確に動いてはいるんですが、上司から「間違ってはいないけど、中途半端なトコからメモリを使うな」とのことでして。 当方、組込み系の職場なので、メモリに関しては特にうるさいみたいです。 どう直したらよいのか困っております。 おそらく argv[0]→ox61 から argv[25]→0x7a のように頭から無駄なく使えと言っていることまではわかりました。 これをどう表現したらいいのかが。。。 Linux Fedora Core 6を使用しております。 お恥ずかしい質問ではございますが、よろしくお願いいたします。
- 締切済み
- C・C++・C#
- コマンドライン引数
コマンドライン引数で以下のようなプログラムを実行したいのですが どうしたらいいのか分かりません!! みなさんの意見を聞かせてください(lll´Д`lll) □☆□□□☆□□□☆□□□☆□ ☆★☆☆☆★☆☆☆★☆☆☆★☆ □☆□□□☆□□□☆□□□☆□ □☆□□□☆□□□☆□□□☆□ ☆★☆☆☆★☆☆☆★☆☆☆★☆ □☆□□□☆□□□☆□□□☆□ □☆□□□☆□□□☆□□□☆□ ☆★☆☆☆★☆☆☆★☆☆☆★☆ □☆□□□☆□□□☆□□□☆□ □☆□□□☆□□□☆□□□☆□ プログラムは途中まで作ったのですが、肝心なとこは 全く分りませんっっ #include <stdio.h> int main(int argc, char *argv[]) { int yoko, tate, i, j; if( argc < 3 ) return(1); sscanf( argv[1], "%d", &yoko ); sscanf( argv[2], "%d", &tate ); for( j = 0; j < tate; j++ ) { printf("\n"); } return(0); } /* end of pat2.c */
- 締切済み
- C・C++・C#
- C言語でコマンドラインの引数について。
コマンドラインで引数をわたす基本的なプログラムは main(int argc,char *argv[]){....] ですよね。 今回実行時に、 >実行ファイル名 123 + 233 といれたら、123+233を計算してくれるプログラムを作ろうとしています。 その場合、main(int argc,int *argv[]){} としたら、argv[1]に123が入って、argv[2]に+が入って、argv[3]に233が、入るというわけではないんでしょうか? とりあえず、確認で #include<stdio.h> main(int argc,int *argv[]) { printf("%d\n%d\n",argv[1],argv[3]); } としてみたんですが、実行結果は、とても長い数字がでてきてきました。 なにがいけないのか教えてください。 お願いします。 あとWindows MEでVC++6を使ってます。
- ベストアンサー
- C・C++・C#
- 「コマンドライン引数チェック」て何
#include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char gyou[1024]; int gyousuu = 0; if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } fp = fopen(argv[1], "r"); if ( fp == NULL ){ printf("fopen dekinai\n"); return -2; } while(fgets(gyou, sizeof(gyou), fp) != NULL){ gyousuu++; } fclose(fp); printf("gyousuu=%d\n", gyousuu); return 0; } 以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。 さて以上の if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } は「コマンドライン引数チェック」を行っています。・・・ if ( argc < 2 ){の「argcは2以上である必要がある」と参考書に書いてあります。 以上ですが意味が日光手前ですが、プログラムの行数をカウントするうえで、 「コマンドライン引数チェック」とはどんな作業を行っているとこなのでしょうか!? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- コマンドラインから引数を渡すことについて
----------------------------------------------- #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[ ]) { FILE *fin,*fout; char ss[256]; if(argc != 3){ printf("引数の数が違います\n"); exit(1); } if((fin=fopen(argv[1],"r"))==NULL){ printf("入力ファイルをオープンできません\n"); exit(1); } if((fout=fopen(argv[2],"w"))==NULL){ printf("出力ファイルをオープンできません\n"); exit(1); } while(fgets(ss,256,fin)!=NULL){ fputs(ss,fout); } fclose(fin); fclose(fout); return 0; } ----------------------------------------------- 以上のプログラム名は「tcopy.cpp」でコマンドプロンプトから実行し、ファイルをコピーするという事を行っていきます。 「aaa.txt」と「bbb.txt」の2つを用意し、「aaa.txt」の内容、 abcdef ABCDEF 012345 を「bbb.txt」にコピーしていきます。 そこで疑問なのですが、ファイルをコピーする際、コマンドプロンプトから、 >tcopy aaa.txt bbb.txt と打ち込むとコピー出来るようであり、「tcopy」、「aaa.txt」、「bbb.txt」が引数になるという事なのですが、何故この3つが引数になるのかという事と、 int main(int argc,char *argv[ ]) のargcに引数が何故代入されるかが分かりません。 後、「aaa.txt」と「bbb.txt」がargv[1]とargv[2]に何故対応しているかが分かりません。 教えていただければ嬉しいです。
- ベストアンサー
- C・C++・C#
- Cでファイルの行数をカウントするには
ファイルの中の行数をカウントするにはどうすればよいか プログラムの行数ならその行数分だけ またコメントや空白行もカウントするにはどうしたらよいか 以下のプログラムに追加したい場合どうしたらよいか教えてください。 #include <stdio.h> int main(int argc , char *argv[]){ char s[256]; int i; FILE *fin; int local; int nCount = 0; for(i = 1 ; i < argc ; i++){ printf("%s\n",argv[i]); local = 0; fin=fopen(argv[i],"r"); memset(s,0,sizeof s); while(fgets(s,sizeof s,fin) != NULL){ // printf("%s",s); local++; nCount++; } memset(s,0,sizeof s); while(fgets) printf("local count = %d\n",local); fclose(fin); } printf("grobal count = %d\n",nCount); return 0; }
- 締切済み
- C・C++・C#
- コマンドライン引数argv[]について
C言語初心者です。以下のようなプログラムを書いたのですが、コンパイルで来ません。関数func1, func2を分けずに全てメインに書けば動作するのですが、なぜ関数に分けてしまうとコンパイル出来ないのかがわかりません。エラー内容は、argvが宣言されていない、といった内容です。 #include <stdio.h> void func1(void){ printf("%s\n", argv[1]); } void func2(void){ printf("%s\n", argv[2]); } int main(int argc, char *argv[]){ if(strcmp(argv[1], "abc")==0){ func1(); } else{ func2(); } }
- ベストアンサー
- C・C++・C#
- コマンドプロンプトを使用してのコマンドライン引数
winXPのコマンドプロンプトを利用して 参考書「独習C」を使い、C言語の学習をしています。 その本の7.4の項目~main()の引数~で main(int argc,char *avgv[])を利用すると コマンドラインから引数をとることができるとありますが 私の学習環境ではうまくいきません。 具体的には #include <stdio.h> int main(int argc, char *argv[]) { int i; for(i=1; i<argc; i++) printf("%s ", argv[i]); return 0; } というプログラムを実行しても何も表示されません。 どうすればコマンドライン引数を利用できますか?
- ベストアンサー
- C・C++・C#
- コマンドライン引数について。
コマンドライン引数についての質問です。 コマンドライン引数に適当な数字をいれ、金種別にわけるプログラムですが、 コマンドライン引数に負の値や、文字列を入力したときにはエラーが表示させるようにしているのですが、 数字と文字を混合したもののときはエラーが表示されずにそのまま処理されてしまいます。 初めの一文字目が数字だったらそのあとに文字を入れても実行されてしまうようです。 全て数字の場合のみ実行させてそれ以外はエラーメッセージを表示させたいのですが、どのようにすればいいでしょうか? #include <stdio.h> #include <stdlib.h> int syubetu(int money,int *kinsyu); int *kinsyu; int main(int argc,char *argv[]) { int *p,a; p=(int*)malloc(sizeof(int)*9); if(p==NULL){ printf("メモリ確保失敗\n"); exit(1); } a=atoi(argv[1]); if(a>0){ syubetu(a,&p[0]); printf("1万円 %d枚\n",p[0]); printf("5千円 %d枚\n",p[1]); printf(" 千円 %d枚\n",p[2]); printf("5百円 %d枚\n",p[3]); printf(" 百円 %d枚\n",p[4]); printf("50円 %d枚\n",p[5]); printf("10円 %d枚\n",p[6]); printf(" 5円 %d枚\n",p[7]); printf(" 1円 %d枚\n",p[8]); } else{ printf("入力エラー\n"); exit(1); } } int syubetu(int money,int *kinsyu) 800字以上になるため、処理は省略します。
- ベストアンサー
- C・C++・C#
- 英文字の出現頻度
英語で書かれているファイルを読み込んで英文字の出現頻度を調べるプログラムを作ったのですが、ところどころ正確な数が表示されません。どなたか教えてもらえませんか?欲を言えばスペースや改行もカウントできれば良いのですが・・・よろしくお願いしますm(_ _)m #include <stdio.h> #define N 500 int main(int argc, char *argv[]) { int c,i=0; int X[N]; FILE *fp; char ch[N]; if( argc != 2) { printf("使い方:コマンド名に続きファイル名を入れてください\n"); return -1; } fp = fopen( argv[1],"rb"); while(fgets(ch,500,fp) != NULL ) { printf("%sファイルにおけるアルファベットの出現頻度\n",argv[1],ch); { while ((c = getc(fp)) != EOF) if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') X[c]++; { for (c = 'a'; c <= 'z'; c++) printf("%c:%d\n",c, X[c]); printf("\n"); for (c = 'A'; c <= 'Z'; c++) printf("%c:%d\n",c, X[c] ); printf("\n"); } } } fclose(fp); return 0; }
- 締切済み
- C・C++・C#
お礼
感動しました。 ありがとうございます。 泣きそうです。