ちくのう症(蓄膿症)は「菌」が原因!?

文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。

と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。
多分main関数の部分をちょっといじくればよいと思うのですが…。
どなたかアドバイスをお願いします。
#include <stdio.h>

int count(const char *str, const char ch)
{
int cnt=0;
while (*str!='\0')
{
if (*str==ch)
cnt++;
str++;
}
return cnt;
}

int main()
{
const char *str="hello,world!";
const ch='o';

int cnt;

cnt=count(str, ch);

printf("%s中に%cは%d個です\n", str, ch, cnt);


return 0;
}

このQ&Aに関連する最新のQ&A

A 回答 (2件)

scanf"%s", str)は、バッファオーバーフローの危険と改行文字の食べ残し問題がありますね。


-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
int main()
{
char ch;
char str[BUFSIZ];
int cnt;

printf("文字列を入力して下さい > ");
fgets(str,BUFSIZ,stdin);

printf("カウントする文字を入力してください > ");
ch = getchar();

cnt=count(str, ch);
printf("%s中に%cは%d個です\n", str, ch, cnt);

return 0;
}
    • good
    • 1
この回答へのお礼

回答を頂きありがとうございます!
このプログラムだと家にあるC言語のコンパイラでも
コンパイルする事が出来ました。

お礼日時:2005/12/22 03:47

最近C言語を使ってませんが、count関数に渡す引数をmain関数で標準入力させたいってことですか?



int main()
{
char ch;
char str[256];
int cnt;

printf("文字列を入力して下さい > ");
scanf("%s", str);

printf("カウントする文字を入力してください > ");
scanf("%c", ch);

cnt=count(str, ch);
printf("%s中に%cは%d個です\n", str, ch, cnt);

return 0;
}
    • good
    • 2
この回答へのお礼

素早い回答をありがとうございます!。
早速明日学校で試してみようと思います。

お礼日時:2005/12/20 01:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC++で指定文字列のカウント方法(テキストマイニング)

大学でC++ builder を使った授業を受けておりましたが、いつも早く終わっていた(教科書を写すだけなのでタイピングが早ければすぐ終わる)のをC++が得意と勘違いされ、試験を免除する代わりにテキストマイニングに関連するソフトを作るという課題を言い渡されました。
テキストマイニングの意味は大体理解し、掲示板などからとってきたテキストデータの中にある「美味しい」と「不味い」の文字列の個数を数え上げるプログラムを作ろうと考えていますが、やり方が全くわかりません。授業では「学生のためのC++builder」という主に数値計算を扱った教科書の例題を実行するというもので、テキストデータの扱い方はほぼまったくしていません。
今までにやった中でファイルを扱ったようなものとしては
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog1->Execute();

//入力ファイル用ストリームのオブジェクト(fin)を生成する
ifstream fin;

fin.open(OpenDialog1->FileName.c_str());

//エラー対策
if(!fin){
ShowMessage("ファイルのオープンに失敗しました!!");
exit(1);
}

double sintyo;
char name[20];

//ファイルから氏名、身長データを読み込む
fin>>name>>sintyo;
while(!fin.eof()){
StringGrid1->Cells[0][n]=(String)name;
StringGrid1->Cells[1][n]=FormatFloat("###0.0",sintyo);
data[n]=sintyo;
n++;
fin>>name>>sintyo;
}
fin.close();
}
だけであり、それを元にして改良するということができそうにありません。
最初からチェックしていって、「美味い」など指定文字列があればdに1を加えるなど、アルゴリズムを考えること自体はできるとは思います。
しかも期限は一週間となっています。
どなたか方法をお教えいただけませんでしょうか。

大学でC++ builder を使った授業を受けておりましたが、いつも早く終わっていた(教科書を写すだけなのでタイピングが早ければすぐ終わる)のをC++が得意と勘違いされ、試験を免除する代わりにテキストマイニングに関連するソフトを作るという課題を言い渡されました。
テキストマイニングの意味は大体理解し、掲示板などからとってきたテキストデータの中にある「美味しい」と「不味い」の文字列の個数を数え上げるプログラムを作ろうと考えていますが、やり方が全くわかりません。授業では「学生のためのC++bu...続きを読む

Aベストアンサー

完全に答えですけどプログラム作ってみました。

***実行前に行う事***
実行ファイルと同じフォルダに
test.txt
というファイルを置いてください。
これは検索の対象となる文章を書いたファイルです。
よくわからない場合は以下の手順にそって行ってください。

まず
「C言語入門。C言語について学んでいます。」
と書いて
test.txt
という名前で保存。(保存する場所は実行ファイルと同じフォルダ)

以下のプログラムをコンパイル

#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 10000
char string[BUFFER_SIZE];

void kensaku(void){
  struct s{
    char st[100];
    int counter;
  };
  struct s string2[100];
  int i=0,j=0,n,count=0,h_count=0;
  char string3[100];
  printf("検索終了を示す文章を入力してください。(この文章は検索出来ません)\n");
  scanf("%s",&string3);
  printf("設定完了。検索終了時には「%s」と入力してください。\n",string3);

  while(1){
    printf("\n*********************************************\n");
    printf("検索したい文章は?(終了は「%s」と入力)\n",string3);
    scanf("%s",&string2[h_count].st);

    if(strcmp(string2[h_count].st,string3)==0)
      break;

    n = strlen(string2[h_count].st);
    while(string[i]!='\0'){
      if(string[i]==string2[h_count].st[j]){
        j++;
        if(j==n)
          count++;
      }
      else{
        j=0;
      }
      i++;
    }
    printf("「%s」の検索ヒット数[%d]回\n\n",string2[h_count].st,count);
    string2[h_count].counter=count;
    h_count++; i=0; count=0;
  }
  printf("検索終了\n\n");
  i=0;
  while(i<h_count){
    printf("「%s」\tの検索ヒット数\t[%d]回\n",string2[i].st,string2[i].counter);
    i++;
  }
  return;
}

void main(){
  char string2[BUFFER_SIZE];
FILE *fp;
fp = fopen("test.txt", "r");

if ( !fp )
printf("ファイルオープンエラー\n");
  else{
    while( fscanf(fp, "%s" , string2) != EOF){
      strcat(string,string2);
    }
}
  kensaku();
  fclose(fp);
}

コンパイル画面に最初

「検索終了を示す文章を入力してください。(この文章は検索出来ません)」

と出ますから何か自分で決めたキーワードを入力してください。
(例:finish)

次に

「検索したい文章は?」

と出ますから、そしたら
例えば「言語」と入力してエンター押します。

すると

「言語」の検索ヒット数[2]回

と表示されます。また

「検索したい文章は?」

と出ますから連続で検索したい場合はまた、続けます。
終わりたい場合は最初に決めた文字列を入力。例ではfinish。

すると検索結果一覧が表示され、終了します。

一度コンパイルしてみて、実行できるかどうか試してください。

注意:なお、プログラムは見やすいように、tabインデント(字下げ)が全角スペースに置換してありますから、
お使いのソフトで全角スペースをtabインデントなどに置換してからコンパイルしてください。
全角文字があるとエラーになると思うので。

コンパイルできなかった場合や、解らない事があった場合はまた聞いてください。

完全に答えですけどプログラム作ってみました。

***実行前に行う事***
実行ファイルと同じフォルダに
test.txt
というファイルを置いてください。
これは検索の対象となる文章を書いたファイルです。
よくわからない場合は以下の手順にそって行ってください。

まず
「C言語入門。C言語について学んでいます。」
と書いて
test.txt
という名前で保存。(保存する場所は実行ファイルと同じフォルダ)

以下のプログラムをコンパイル

#include <stdio.h>
#include <string.h>
#define BUFFER_S...続きを読む

Q数字文字をカウントするプログラムの動作について

良い質問のタイトルが思い浮かばず、分かりづらいタイトルで申し訳ありません、C言語について質問させて頂きます。
C言語の参考書を買って夏休み中にプログラムの勉強をしているのですが、何故動作するのかがわからない例があります、ソースは以下の通りです。

#include <stdio.h>

int main(void)
{
int i,ch;
int cnt[10] = {0};

while(1)
{
ch = getchar();
if (ch==EOF) break;

switch(ch)
{
case '0' : cnt[0]++;printf("%d\n",ch);break;/* printfは確認の為 */
case '1' : cnt[1]++;printf("%d\n",ch);break;
case '2' : cnt[2]++;printf("%d\n",ch);break;
case '3' : cnt[3]++;printf("%d\n",ch);break;
case '4' : cnt[4]++;printf("%d\n",ch);break;
case '5' : cnt[5]++;printf("%d\n",ch);break;
case '6' : cnt[6]++;printf("%d\n",ch);break;
case '7' : cnt[7]++;printf("%d\n",ch);break;
case '8' : cnt[8]++;printf("%d\n",ch);break;
case '9' : cnt[9]++;printf("%d\n",ch);break;
}
}

puts("数字文字の出現回数");
for(i=0;i<10;i++)
printf("'%d':%d\n",i,cnt[i]);
getchar();getchar();

return(0);
}

といったプログラムです。

実行し、数値を入力、CTRL+Zで入力を終了し、出現回数を表示させる、という動作自体は無事にできるのですが、何故chの値が変更していくのかがわかりません、数値を入力した時点で51や49といったそれぞれ違う数値が表示されるのですが、chの値を変更させる命令を、何が引き起こしているのかが理解できません、3(51)と判定されて同じ数が無限にカウントされないのは何故なのでしょうか・・・・?

また、その後の無限ループからの脱出をCTRL+Zがどうして引き起こすのかも理解できず困っています、教科書には「CTRL+Zは入力の終了を意味する」とあるのですが、これは一体どういう意味なのでしょうか、強制的に割り込んでEOFを代入するということなのでしょうか・・・?

お時間がある時にでも、教えて頂けると助かります、よろしくお願いします。

良い質問のタイトルが思い浮かばず、分かりづらいタイトルで申し訳ありません、C言語について質問させて頂きます。
C言語の参考書を買って夏休み中にプログラムの勉強をしているのですが、何故動作するのかがわからない例があります、ソースは以下の通りです。

#include <stdio.h>

int main(void)
{
int i,ch;
int cnt[10] = {0};

while(1)
{
ch = getchar();
if (ch==EOF) break;

switch(ch)
{
case '0' : cnt[0]++;printf("%d\n",ch);break;/* printfは確認の為 */
case '1' : cnt[1]++;printf("%d\n",ch);b...続きを読む

Aベストアンサー

>getchar関数とは入力した文字を順番に3、.、1、4、と返す関数ということなのでしょうか・・?

基本的にはそれで合ってます。
ただ、'3'、'.'、'1'、'4'という文字そのものを返す訳ではなく、アスキーコードを返します。
http://e-words.jp/p/r-ascii.html

平たくいうと、コンピュータは0と1の世界ですから、'a'などの文字も数値としてハードディスクに保存する必要があります。人間が見て分かる文字とコンピュータの世界のコードとの対応表がアスキーコード表です。
OSを始め様々なソフトが、この保存された数値を人間が見て分かりやすい文字に変換してくれてるわけです。


今回の例で言うと、入力された数値をアスキーコードではなく、配列の添字として使いたいので、
int index = ch - '0';
としています。

int index = ch - 48;
でもいいんですが、マジックナンバー(プログラム中に書かれた0, 1以外の数値)を嫌う人もいますので、'0'としています。



printfで%dで出力すると、アスキーコードの値がそのまま出力されます。
これを入力した文字そのものを出力したい場合は、%cを使用します。

>getchar関数とは入力した文字を順番に3、.、1、4、と返す関数ということなのでしょうか・・?

基本的にはそれで合ってます。
ただ、'3'、'.'、'1'、'4'という文字そのものを返す訳ではなく、アスキーコードを返します。
http://e-words.jp/p/r-ascii.html

平たくいうと、コンピュータは0と1の世界ですから、'a'などの文字も数値としてハードディスクに保存する必要があります。人間が見て分かる文字とコンピュータの世界のコードとの対応表がアスキーコード表です。
OSを始め様々なソフトが、この保存された数...続きを読む

Q数字文字の出現回数を表示するプログラム(C言語)

タイトルのようなプログラムをCで作ろうとしています。ちなみに初学者です。
たとえば 32356695 と入力すると
'0' appeared 0 times.
'1' appeared 0 times.
'2' appeared 1 times.
'3' appeared 2 times.
'4' appeared 0 times.
'5' appeared 2 times.
'6' appeared 2 times.
'7' appeared 0 times.
'8' appeared 0 times.
'9' appeared 1 times.
と表示されるようにしたいです。そこで以下のようなプログラムを組みましたが
コンパイルは成功するもexeを実行すると数字入力後エラーメッセージが出ます。
*************************************************
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


int main(void)
{
int i;
int count[10]={0};
int length;
int digit;
char str[100];

printf("Please input number:");
gets(str);

length = strlen(str);

for(i=0;i<length;i++){

if(str[i]>='0' && str[i]<='9'){
digit = atoi(&str[i]);
count[digit]++;
}
}

for(i=0;i<=9;i++){
printf("'%d' appeared %d times.\n",i,count[i]);

}

return(0);
}
******************************************************
よくわからないのですが何故か文字列の長さを収納する変数lengthが1になているようです。
どうかお力添えください。お願いいたします。
コンパイラはbcc32、OSはWindowsXPです。

タイトルのようなプログラムをCで作ろうとしています。ちなみに初学者です。
たとえば 32356695 と入力すると
'0' appeared 0 times.
'1' appeared 0 times.
'2' appeared 1 times.
'3' appeared 2 times.
'4' appeared 0 times.
'5' appeared 2 times.
'6' appeared 2 times.
'7' appeared 0 times.
'8' appeared 0 times.
'9' appeared 1 times.
と表示されるようにしたいです。そこで以下のようなプログラムを組みましたが
コンパイルは成功するもexeを実行すると数字入力後エラーメッセージが...続きを読む

Aベストアンサー

がるです。

> しかし何故digit = atoi(&str[i]);はダメで、がるさんの言うように
> 別の配列に入れなおすとうまく行くのでしょうか。
うい。ではちょっと詳細に。

例えば、strに
0123
と入ってるとします。正確には文字の後ろに¥0が入っているので、¥0をnで表現するとして
0123n
となります。
今回取得したいのは、0であったり1であったりといった「数字一桁」になります。
では、i=0の場合の&str[i]を考えて見ます。
str[i]は今回str[0]になるので、文字の先頭は0になります。ただ、atoiは「char *」を引数として期待しているため、当然のように「¥0があるところまで」を数字として取ってきます。
0123n
あれ?
これでは、取りたい数字になりません。
# このあたり、元のソースで、atoiの直後に、printfでdigitの値をprintするとわかります。

で。そのために「一文字だけを格納した別領域」を用意してやります。
それがcwk文字配列になります。

ちなみに、cwkは「char work」の略です(笑
ええあまり推奨できるネーミングではありませんが…便利なので、局所に限ってはたまに使います。特にテスト用のコードの場合。

こんなんで説明になりますでしょうか?

あと。#3さんのおっしゃるようなやり方もありです。ただしそれはASCIIコードなどに依存するので、一応コメントにそんな風に書いておいたほうがよいです(0-9が不連続にマッピングされているコード体系も存在するので)。

がるです。

> しかし何故digit = atoi(&str[i]);はダメで、がるさんの言うように
> 別の配列に入れなおすとうまく行くのでしょうか。
うい。ではちょっと詳細に。

例えば、strに
0123
と入ってるとします。正確には文字の後ろに¥0が入っているので、¥0をnで表現するとして
0123n
となります。
今回取得したいのは、0であったり1であったりといった「数字一桁」になります。
では、i=0の場合の&str[i]を考えて見ます。
str[i]は今回str[0]になるので、文字の先頭は0になります。ただ、atoiは...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Q決まった文字の数を数える

数を数えるプログラミングをしています。
あるきまった文字だけをカウントして、その出現回数だけを数えたいのです。
途中まで考えてみたのですが、決まった文字が出現するとこでどうしたらいいか分からなくなりました。
できるだけ自分でやりたいと思ってるので、使える関数や続きの考え方を教えてもらえるとうれしいです。
初心者なのでよろしくお願いします。

a後にbが来たときだけを数えるものです。

char *a;
int i;

moji[20] //abcddcbaが入っている

a = moji;

/*ここから下を考えてる途中*/

if( *a != 0 )
{
for(;*( a+1) != 0; a++ )
{
if( *a == 'a' )
{
if( *(a+1) == 'b' )
{

Aベストアンサー

#2です。

> abがどこにあっても数えられますかね...
> Abと言う場合もかえられないといけないんです...

strstr
strlen
辺りを使って汎用的な関数を作れば、
"ab"だろうが"Ab"だろうが"cDeF"でもできますよ。
"ab"と"Ab"の2回呼び出してもいいんだから。

でも大文字小文字に対応するなら
toupper
とか使うのが普通だけど

Q文字数と単語数を数えるプログラム

When in Rome, do as the Romans do.
をchar形配列に格納し、文字列に含まれる(空白以外の)文字数と単語数を数え、結果を画面に出力するプログラムがうまくできません。文字数と単語数の数え方がさっぱり…
アドバイスしていただけると幸いです。よろしくお願いします

Aベストアンサー

文字数も数えると云う事なので、左から右端(NULL文字)まで1文字ずつ
走査して行きます。ここで、単語も構成する文字がA-Z,a-zであるとして、
文字から空白や記号(','や'.'、NULL文字も含む)に変わったら一つの単語
とします。

具体的には、

1. カウンタ、フラグを初期化
2. NULL文字になるまで繰り返し
3. 文字かどうか判定する
4. 文字なら文字をカウントして、フラグをセット
5. 文字でないなら、
6. フラグがセットされていれば単語数をカウントしフラグをおろす
7. フラグがセットされていないのなら何もしない
8. 1へ

でいけると思います。

Qセグメンテーション違反

C言語を使用しています。

構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に
「セグメンテーション違反です (core dumped)」
となってしまい、それ以上行えません。

構造体と代入したい変数との型は、合っています。

いろいろ本などで見ましたが、何が原因かわからず困っています。
教えてください。
宜しくお願いします。

Aベストアンサー

OSは何でしょうか。コンパイラは何を使用していますか?
通常、デバッグオプションをつけて実行すると、異常の発生したソースの箇所で止まりますので、それが手がかりになります。またNo1の方が言われてますように、ソースが公開できるのであれば、ソースを提示するのが良いかと思います。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qファイルから入力した文字数をカウントして出力する。

ファイルから入力した文字数をカウントしてファイルに出力するプログラムをVC++のC言語を使ってビルドしたのですが警告が出ます。
何処が拙いのでしょうか?
教えて下さい。
実行環境はOSがWindows Vistaで統合開発環境がVisual C++ 2008です。
C言語初心者なので分かりやすく教えて下さい。

/* count_char.c */
#include <stdio.h>
#include <stdlib.h>/* for exit(); */

int main(int argc, char *argv[])
{
FILE *fin, *fout;
int len;
int ch;
char ss[80];

if (argc != 3) {
printf("引数の数が違います、エラー。用法:count_char fromfile tofile\n");
exit(1);
}

if ((fin = fopen(argv[1], "r")) == NULL) {
printf("読み込みファイル%sがオープン出来ません。\n", argv[1]);
exit(1);
}
if ((fout = fopen(argv[2], "w")) == NULL) {
printf("書き込みファイル%sがオープン出来ません。\n", argv[2]);
exit(1);
}

len = 0;
while ((ch = fgetc(fin)) != EOF) {
len++;
}

sprintf(ss, "文字数=%d\n", len);
fputs(ss, fout);

fclose(fin);
fclose(fout);

return 0;
}

警告の内容は以下の通りです。

1>------ ビルド開始: プロジェクト: count_char, 構成: Debug Win32 ------
1>コンパイルしています...
1>count_char.c
1>c:\vc9\count_char\count_char\count_char.c(16) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237) : 'fopen' の宣言を確認してください。
1>c:\vc9\count_char\count_char\count_char.c(20) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237) : 'fopen' の宣言を確認してください。
1>c:\vc9\count_char\count_char\count_char.c(30) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。
1>マニフェストをリソースにコンパイルしています...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Micros

ファイルから入力した文字数をカウントしてファイルに出力するプログラムをVC++のC言語を使ってビルドしたのですが警告が出ます。
何処が拙いのでしょうか?
教えて下さい。
実行環境はOSがWindows Vistaで統合開発環境がVisual C++ 2008です。
C言語初心者なので分かりやすく教えて下さい。

/* count_char.c */
#include <stdio.h>
#include <stdlib.h>/* for exit(); */

int main(int argc, char *argv[])
{
FILE *fin, *fout;
int len;
int ch;
char ss[80];

if (argc != 3) {
printf("引数の数が違います、...続きを読む

Aベストアンサー

fopen()で警告が出るのはstdio.hを見れば解ると思うのですが、通常
fopen(const char *, const char *);
となっており、宣言とコードが食い違うためと考えられます。

また現在ではfopen_s()を使用することがMicrosoftで推奨されています。
詳細は以下のサイトを御覧ください。

http://msdn.microsoft.com/ja-jp/library/z5hh6ee9(v=VS.80).aspx

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング