gooポイントが当たる質問投稿キャンペーン>>

8進数は、7を超える、つまり8になると桁上がりし0から7までの数字の組み合わせで、16進数は、15を超えると桁上がりし、0から9、AからFまでの数字英字の組み合わせです。
ここで質問ですが
https://msdn.microsoft.com/ja-jp/library/edsza5c …
で記述されている「8進数文字」「16進数文字」とはいったい何なのでしょうか。

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

A 回答 (3件)

文字コードはご存じですよね。



URLには、8 進文字と 16 進文字の仕様、とあります。同じ文字を、8進数文字コードでも16進数文字コードでも、あらわせると言うことです。
    • good
    • 1

全体像をどこまで理解されているか分からないので、とりあえず簡単に。



制御文字などを含む、キーボードから直接入力できない(ことがある)文字または文字列を
定数として記述したいとき、どうするか。
・特定のエスケープシーケンスを使用する。'¥n' で改行など。
・8進数、16進数の文字コードで指定する。'¥012' や '¥x0a' など。← ここが該当ページのトピック
ということです。
    • good
    • 1

>で記述されている「8進数文字」「16進数文字」とはいったい何なのでしょうか。


そのレベルで、別次元で高等なページなんか見ない方がいいよ。
そんなページ見たら疑問はそこだけでないでしょ。
エスケープシーケンス?
ASCIIフォールバック文字?
ワイド文字定数?

Visual Studio 2015 というソフトウェアを使う上での仕様が書かれてるので
「x進数」のことを考えるのとは別次元のいろんな意味を含んでるので。
そういうソフトウェア開発をするようになってから悩めばいい。

>8進数は、7を超える、つまり8になると桁上がりし
>0から7までの数字の組み合せで、
>16進数は、15を超えると桁上がりし、0から9、AからFまでの
>数字英字の組み合わせです。

まぁそうですが、別の言い方すれば
8進数は文字8個(0~7)で、
16進数は文字16個(0~9、A~F)で
数値を表す表現方法です。

と言っても、
「1日の時間は24進数」とか「1分、1時間は60進数」などとの言い方は
これには当てはまりませんが。
    • good
    • 0

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

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

Q03分22秒36のような時間の単位を16進数で表すと、どうなりますか?

03分22秒36のような時間の単位を16進数で表すと、どうなりますか?
また、どうしてそのようになるのか、その変換の過程も教えてください。
お手数ですが、どうぞよろしくお願いします。

Aベストアンサー

私がプログラムを作るならば、ですが、静的に時間を表記するだけで計算式にも一切使わないのであればNo.3の方のように、時、分、秒、その下の位のそれぞれの座の数値をそれぞれ独立したビットの座で表現します(例えば分、秒をそれぞれ6ビット、秒の小数点以下を7ビットで表現し、これをくっつけて表現します)。またストップウォッチのように時間をカウントするのであれば、単位時間の積み重ね(ご質問文の時間表記だと、単位時間を100分の1秒とか)で表現します。

前者の場合、ただ画面に表示するだけの目的ぐらいにしか使えませんが、取り出したい座のビットマスクとの論理積とシフト演算だけで時、分、秒等の数字を取り出すことが容易です。しかし、足し算やインクリメントなど計算を伴うと、繰り上がりや繰り下がりを実現するために条件分岐が多発するため効率よくありません。
後者の場合、インクリメントや足し算などは容易に行うことができます。時、分、秒などを取り出すのは前者ほど単純ではありませんが、それにしても四則演算のみで取り出すことができるため条件分岐を多用する必要がなく、それほど効率の悪いものでもありません。

しかし、03分22秒36を 0C 04 ですか・・・これはちょっとわかりませんね。
後者の表記法にて単位時間を100分の1秒とすると、03分22秒36は単位時間の積み重ねだと10進数で20236(202.36秒)ですが、これを16進数で表現すると 4F 0C になります。インテル系CPUのバイトオーダーでは 0C 4F 00 00 (32ビットの場合)な感じにメモリに格納されると思います。見間違えているとか、実は3分22秒36とは違う時間だった、ってことはないですよね。

私がプログラムを作るならば、ですが、静的に時間を表記するだけで計算式にも一切使わないのであればNo.3の方のように、時、分、秒、その下の位のそれぞれの座の数値をそれぞれ独立したビットの座で表現します(例えば分、秒をそれぞれ6ビット、秒の小数点以下を7ビットで表現し、これをくっつけて表現します)。またストップウォッチのように時間をカウントするのであれば、単位時間の積み重ね(ご質問文の時間表記だと、単位時間を100分の1秒とか)で表現します。

前者の場合、ただ画面に表示するだけの目的ぐ...続きを読む

QC言語で四則演算を使って10を作るプログラム

C言語のプログラミングの問題です。
1桁の整数4つをキーボードから入力して、四則演算で10になる式をすべて出力するという問題で、演算子の優先順位ありで、括弧は使わないとし、数字は入れ替え可能です。
また、プログラムはint型の変数を用いるというものです。
とりあえずは数字入れ替えなしで、次のような力技でソースコードを作ってみたのですが、数字の入れ替えまで考えるとあまりに力技すぎるようなだらだらとしたプログラムになってしまいます。。。
数字の入れ替え可能としてもっと簡単なプログラムを作るにはどのようなソースコードになるのでしょうか。

以下ソースコードです。

#include<stdio.h>
#include<math.h>

int main(void) {

int a, b, c, d = 0;

printf("一桁の整数4つを入力してください。\n");
scanf_s("%d %d %d %d", &a, &b, &c, &d);

if (a + b - c * d == 10)
printf("%d+%d-%d*%d\n", a, b, c, d);
else if (a + b - c / d == 10)
printf("%d+%d-%d/%d\n", a, b, c, d);
else if (a + b * c - d == 10)
printf("%d+%d*%d-%d\n", a, b, c, d);
else if (a + b * c / d == 10)
printf("%d+%d*%d/%d\n", a, b, c, d);
else if (a + b / c - d == 10)
printf("%d+%d/%d-%d\n", a, b, c, d);
else if (a + b / c * d == 10)
printf("%d+%d/%d*%d\n", a, b, c, d);
else if (a - b + c * d == 10)
printf("%d-%d+%d*%d\n", a, b, c, d);
else if (a - b + c / d == 10)
printf("%d-%d+%d/%d\n", a, b, c, d);
else if (a - b * c + d == 10)
printf("%d-%d*%d+%d\n", a, b, c, d);
else if (a - b * c / d == 10)
printf("%d-%d*%d/%d\n", a, b, c, d);
else if (a - b / c + d == 10)
printf("%d-%d/%d+%d\n", a, b, c, d);
else if (a - b / c * d == 10)
printf("%d-%d/%d*%d\n", a, b, c, d);
else if (a * b + c - d == 10)
printf("%d*%d+%d-%d\n", a, b, c, d);
else if (a * b + c / d == 10)
printf("%d*%d+%d/%d\n", a, b, c, d);
else if (a * b - c + d == 10)
printf("%d*%d-%d+%d\n", a, b, c, d);
else if (a * b - c / d == 10)
printf("%d*%d-%d/%d\n", a, b, c, d);
else if (a * b / c + d == 10)
printf("%d*%d/%d+%d\n", a, b, c, d);
else if (a * b / c - d == 10)
printf("%d*%d/%d-%d\n", a, b, c, d);
else if (a / b + c - d == 10)
printf("%d/%d+%d-%d\n", a, b, c, d);
else if (a / b + c * d == 10)
printf("%d/%d+%d*%d\n", a, b, c, d);
else if (a / b - c + d == 10)
printf("%d/%d-%d+%d\n", a, b, c, d);
else if (a / b - c * d == 10)
printf("%d/%d-%d*%d\n", a, b, c, d);
else if (a / b * c + d == 10)
printf("%d/%d*%d+%d\n", a, b, c, d);
else if (a / b * c - d == 10)
printf("%d/%d*%d-%d\n", a, b, c, d);
else {
printf("10になる組み合わせはありません。");
}

return 0;

}

C言語のプログラミングの問題です。
1桁の整数4つをキーボードから入力して、四則演算で10になる式をすべて出力するという問題で、演算子の優先順位ありで、括弧は使わないとし、数字は入れ替え可能です。
また、プログラムはint型の変数を用いるというものです。
とりあえずは数字入れ替えなしで、次のような力技でソースコードを作ってみたのですが、数字の入れ替えまで考えるとあまりに力技すぎるようなだらだらとしたプログラムになってしまいます。。。
数字の入れ替え可能としてもっと簡単なプログラ...続きを読む

Aベストアンサー

No14です。
calcに一部誤りがありましたので、修正しました。
下記URLが正しいソースになります。こちらを使用してください。
http://climbi.com/b/10192/1
不明点があれば、補足してください。

QC言語の漢字のホルダーは、chdirでは変更出来ないのだろうか。

下記のソースでは、ホルダーが漢字で無い時は成功するが。
漢字を使うと失敗する。

下記に成功する場合を示す。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(){
char *dir1="C:/Users/usui/mingw";
int ret;

ret=chdir(dir1);
printf("%d\n",ret);
}
上記は、漢字を使っていないので結果は0を表示する。
然し、ホルダーに漢字を使うと-1を表示する。

漢字のホルダーを使う方法をお知えて下さい。
宜しくお願いします。

Aベストアンサー

No3です。
ちなみに私がインストールした(今使っているバージョン)のは、下記URLの
mingw-get-inst-20120426.exe です。
https://sourceforge.net/projects/mingw/files/OldFiles/mingw-get-inst/mingw-get-inst-20120426/

QCのプログラムに無性にイライラするのはおかしいですか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  hn[ p[0] ]++;
 }
}

3重にするならせめて、y,x,i の順にしてp[0]への代入は1回で済ませればと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++){
  p[0] = img -> imageData[img->widthStep* y + x*3 ];  //B(青色)
  for( i=0; i<256; i++){
     if(p[0]==i){hn[i]++;}
  }
 }
}

最近のコンパイラの最適化では、私の書いたようなコーディング(修正?)は無意味なのでしょうか?

CQ出版のインタフェース 2017-5 の記事のプログラム例に
for( i=0; i<256; i++){
 for( y =0; y < Y; y++ ){
  for( x = 0; x < X; x++){
   p[0] = img -> imageData[img->widthStep* y + x*3 ]; //B(青色)
   if(p[0]==i){hn[i]++;}
  }
 }
}
がありました。このリストを見て、無性にイライラするのは私だけでしょうか?

なぜ、i,y,x の3重のループで処理しないといけないのか、y,xの2重ループで十分ではないかと思います。

for( y =0; y < Y; y++ ){
 for( x = 0; x < X; x++)...続きを読む

Aベストアンサー

利点を考えてみました


これを並列処理したときに
スレッド0: hn[0] に p[0] = 0 をカウント
スレッド1: hn[1] に p[0] = 1 をカウント
...
とすれば、
・img -> imageData は読み出すだけなので衝突しない
・hn[i] でアクセスする領域は、スレッド毎に i が違うので、同じ箇所に書き込まれることはない。
となり、排他処理が不要となります。
(もちろん、x,y,i,p[0]はスレッドでローカルな変数とします)

ただ、並列処理のオーバーヘッドや同時並列処理数等を考えると、こんな並列処理はしない方が効率的です。


あるいは、hn[]がシークに時間がかかる領域の場合、
hn[p[0]) で毎回違う位置を探しに行って、その時間が無視できないほどだったら、
先にhnを決めてしまった方が速くなるでしょう。

こちらも、非現実的です。

QC言語 a * b / c の計算

特に困っているわけではないのですが、エレガントな方法が見つからないので質問します。

a,c は32ビット、bは8ビット、0<a≦c、0<b がわかっているとします。
このとき、8ビットの整数計算値 a * b / c を「最大32ビットの範囲」で計算する方法、教えてください。
一応C言語で考えていますので、以下の***の部分の具体的な計算方法がわかればうれしいです。

int a,c; // 32bit 符号付き整数
signed char b,d; // 8bit 符号付き整数
if(a<2^(32-8)) d = a * b /c;
else **** ← この部分のプログラム

Aベストアンサー

決してエレガントではありませんが、a, cは正でありしかし符号付の型だという前提で a * b / c の整数の商を求めるのであれば、最初にa - cを求めて一時変数に代入しておき、bの数だけループし、ループ中に一時変数にaを加え、それがc以上になったらdを1加えて一時変数からcを引き去ることを繰り返せば、間違いなくすべての数値は32ビット以内に収まると思います。CPUにALUしかない時代の発想で、歳がばれますね・・・

Qc言語

c言語って本読んで勉強してもどこに保存するのかわかりません。
メモ帳で拡張子.cで保存すればいいのでしょうか
初歩的ですいませんがお願い致します

Aベストアンサー

Cのプログラムの作成とコンパイルの手順
http://guppy.eng.kagawa-u.ac.jp/~kagawa/2011/Programming1/dosPrompt.html

で紹介されている、bcc32というボーランド社製のコンパイラは現在、

プログラムの作成
C++ Compiler - FREE TOOL
https://www.embarcadero.com/jp/free-tools/ccompiler/start-for-free

になっていると思います。

Borland C++ Compilerのダウンロードとインストール - Windows環境
http://webkaru.net/clang/borland-c-compiler-install/

Borland C++ Compilerの設定 - Windows環境
http://webkaru.net/clang/borland-c-compiler-how-to-use/

を見てコンパイラのパスを設定すれば、
フォルダに保存した拡張子cなどのファイルをコンパイル出来るようになります。

Cのプログラムの作成とコンパイルの手順
http://guppy.eng.kagawa-u.ac.jp/~kagawa/2011/Programming1/dosPrompt.html

で紹介されている、bcc32というボーランド社製のコンパイラは現在、

プログラムの作成
C++ Compiler - FREE TOOL
https://www.embarcadero.com/jp/free-tools/ccompiler/start-for-free

になっていると思います。

Borland C++ Compilerのダウンロードとインストール - Windows環境
http://webkaru.net/clang/borland-c-compiler-install/

Borland C++ Compilerの設定 - Windows環境
http:/...続きを読む

Qプログラムについての質問です。 fflush(stdout)はいったいどのような時に使われているので

プログラムについての質問です。

fflush(stdout)はいったいどのような時に使われているのですか?
意味を調べると、バッファのフラッシュとか
書いてありますが、それをすると結局どうなるのか、
メリットは何かまでは、調べても説明されていません。
使い道がよく分からず困っています。
よろしくお願いします。

Aベストアンサー

メリットどうこうで考える関数ではないですね

prinitf("hello");
とプログラムに書いたとしましょう
そうすると画面に何が出てくると思いますか?
hello?Windows系のOSなのであればそう出てくるかも知れませんが
Unix系のOSだと実は何も出てきません

では「hello」という文字列はどこに言ったのか
これはバッファというところに一度格納されます
それを明示的に表示するように指定しなければ
バッファに格納されたままになってしまします(プログラムが終了するときに表示されるとは思いますが)

それを行うことが出来るのがfflush(stdout)です
でもいつもそんなことしなくても画面に出てる!!
って思うかもしれません
printf("Hello World!\n")
って多分やりましたよね、このときは普通に出たと思います

それは出力の仕様上
\nが、つまり改行が入力されたらバッファから吐き出されるようになっているのです
なので、一文の最後に必ず改行をつけていれば
特に意識的に使う必要のない関数なんです

後はバッファの容量が限界に達すると自動的に吐き出されます

でも、改行をいれずに出力したいときも出てくるでしょうから
そういうときに使用しますね

メリットどうこうで考える関数ではないですね

prinitf("hello");
とプログラムに書いたとしましょう
そうすると画面に何が出てくると思いますか?
hello?Windows系のOSなのであればそう出てくるかも知れませんが
Unix系のOSだと実は何も出てきません

では「hello」という文字列はどこに言ったのか
これはバッファというところに一度格納されます
それを明示的に表示するように指定しなければ
バッファに格納されたままになってしまします(プログラムが終了するときに表示されるとは思いますが)

それを行うこ...続きを読む

QC言語の問題です

こちらまだC言語を勉強したてであまり知識がありません。どなたかお力をお貸しください。

全部で8名から代表者を3名を無作為に選びたい。一様乱数を0から7の間で発生させる。それを100回試行して最も回数の多い順に並べ替えを行って表示した例である。下のような結果を得るプログラムを作成せよ。

第1位 16回 Eさん
第2位 15回 Dさん
第3位 15回 Cさん
第4位 14回 Bさん
第5位 13回 Gさん
第6位 11回 Hさん
第7位 8回 Aさん
第8位 8回 Fさん


#include<stdio.h>
#include<math.h>
#include<string.h>
main(){
int i,j,n,count[8];
unsigned char x;
int w;
char *work;
char *name[8]={"Aさん","Bさん","Cさん","Dさん","Eさん","Fさん","Gさん","Hさん"};

// srand(time(NULL));
for(n=0;n<8;n++){
count[n]=0;
}
for(i=1;i<=100;i++){
x=rand()%8;
count[x]++;
}

for(i=0;i<7;i++){
for(j=i+1;j<8;j++){
ifj]){
work=count[i];
count[i]=count[j];
count[j]=work;
}
}
}

for(i=0;i<8;i++){
printf("第%d位 %3d回 %10s\n",i+1,count[i],name[i]);
}
}

第〜位、〜回はちゃんと表示されるのですが、最後の〜さんがAーHまで順番になってしまいます。
助けてください。よろしくおねがいします。

こちらまだC言語を勉強したてであまり知識がありません。どなたかお力をお貸しください。

全部で8名から代表者を3名を無作為に選びたい。一様乱数を0から7の間で発生させる。それを100回試行して最も回数の多い順に並べ替えを行って表示した例である。下のような結果を得るプログラムを作成せよ。

第1位 16回 Eさん
第2位 15回 Dさん
第3位 15回 Cさん
第4位 14回 Bさん
第5位 13回 Gさん
第6位 11回 Hさん
第7位 8回 Aさん
第8位 8回 Fさん...続きを読む

Aベストアンサー

変数nameの内容を全然操作していません。初期値のままなので、、、

> 最後の〜さんがAーHまで順番になってしまいます。

となるのは当然かと。(^^;
nameをどのように扱えばよいか、countとnameをどのようなデータ構造としたら処理効率がよいかを考えられるとよいです。

で、そういったことは使用するプログラミング言語に完全には依存しない部分かと思います。
例えば名前と回数がペアになったような(論理的な)データ構造を考え、処理手順を日本語で(1), (2), (3), ... とかいった箇条書きで設計されるとよいでしょう。
フローチャートなどのチャート図をご存知でしたらそれで書くのが楽で効率的でしょう。

参考まで。

QC言語で詰まっているので教えて下さい。

下記のソースが有ります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name[]="out/";
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n");
return 1;
}
// }}}
// fgetsでのエラー処理 {{{
if(fgets(buf,64000,fp) == NULL){
printf("data error\n");
return 1;
}
// }}}
// <target>が存在しない時のエラー処理 {{{
p=strstr(buf,"<target>");
if(p == NULL){
printf("target not found\n");
exit(1);
}
// }}}

// 最初のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcat(file_name,q);
// }}}

// 出力ファイルのopen処理 {{{
fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
}
// }}}
while(fgets(buf,64000,fp) != NULL){
p=strstr(buf,"<target>");
if(p == NULL){
fprintf(fp2,"%s",buf);
}else{
// 2回目以降のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcat(file_name,q);
// }}}
// 今使っているファイルを閉じて新しいファイルを開く。{{{
fclose(fp2);

fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
} // }}}
}
}
fclose(fp);
fclose(fp2);
return 0;
}

// vim:set fdm=marker:

入力は、result.txtを読んでそれをフィルターする物です。result.txt
は先頭から順に下記の内容で入力されています。

① <target>ファイル名</target>
② 内容のデータ

上記の①から②を繰り返します。フィルターは①のファイル名で続く
データをそのファイルに出力します。フィルターの数は約1万件にな
る。

処理の内容は、最初の<target>の行を読んで出力ファイルをオープンし
ます。続くデータを<target>行が来る迄出力を続行します。

新しく<target>行が来るとこれ迄使っていた出力ファイルを閉じてまた
新規のファイルを出力としてオープンします。

この処理をresult.txtを最後迄読んだら終了となります。今の問題は、
この処理の中で最初の出力ファイルに出力をしている途中で異常終了し
ます。

何処が不味いのか。検討が付きません。どうか助けて下さい。宜しくお
願いします。

下記のソースが有ります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name[]="out/";
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n");
return 1;
}
// }}}
// fgetsでのエラー処理 {{{
if(fgets(buf,64000,fp) == NULL){
printf("data error\n");
return 1;
}
// }}}
/...続きを読む

Aベストアンサー

以下のようにしてください。
修正した箇所と、追加した箇所に//変更、//追加のコメントを入れておきました。
-------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name_base[]="out/"; //変更
char file_name[256]; //追加
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n");
return 1;
}
// }}}
// fgetsでのエラー処理 {{{
if(fgets(buf,64000,fp) == NULL){
printf("data error\n");
return 1;
}
// }}}
// <target>が存在しない時のエラー処理 {{{
p=strstr(buf,"<target>");
if(p == NULL){
printf("target not found\n");
exit(1);
}
// }}}

// 最初のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcpy(file_name,file_name_base); //追加
strcat(file_name,q);
// }}}

// 出力ファイルのopen処理 {{{
fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
}
// }}}
while(fgets(buf,64000,fp) != NULL){
p=strstr(buf,"<target>");
if(p == NULL){
fprintf(fp2,"%s",buf);
}else{
// 2回目以降のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcpy(file_name,file_name_base); //追加
strcat(file_name,q);
// }}}
// 今使っているファイルを閉じて新しいファイルを開く。{{{
fclose(fp2);

fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
} // }}}
}
}
fclose(fp);
fclose(fp2);
return 0;
}
----------------------------------------------------
誤りは2点です。
1)strcat(file_name,q);
file_nameは"out/"が格納できるサイズしか確保されません。
その為、これを実行すると、確保したサイズ以降の領域が破壊されます。
どこが、破壊されるかは、コンパイラの配置によってきまるので、わかりませんが、どこかが破壊されます。
2)2回目のstrcat(file_name,q);を実行すると
前に実行した残骸のあとから更に文字列が追加されます。

上記を解決するためには
char file_name_base[]="out/"; //変更
char file_name[256]; //追加
を確保し、
一旦、
①file_name_baseをfile_nameにコピーし、
②その後で、strcat(file_name,q);
を実行します。
①②は、必ずペアで実行します。
尚、file_nameは暫定的に256バイトにしましたが、もっとファイル名として大きな文字列が存在するなら
もっと大きくしてください。

以下のようにしてください。
修正した箇所と、追加した箇所に//変更、//追加のコメントを入れておきました。
-------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name_base[]="out/"; //変更
char file_name[256]; //追加
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n...続きを読む

QC++で大量のエラーが出る

下記で、大量のエラーが出る。
//C:/Users/usui/perl/LWP/170220-Iterative_processing/html/01.cpp {{{
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>

using namespace std; // }}}

class filter{
private:
int ret;
DIR *dir;
struct dirent *dp;
char path[]=".";
int ret;
string name;
public:
// コンストラクター
filter(string s){
name = s;
const char* cstr = name.c_str();
ret=chdir(cstr);
if(ret!=0){
cout << "chdirに失敗\n" << name <<endl;
exit(1);
}
//ret=chdir(path);
if((dir=opendir(path))==NULL){
perror("opendir");
exit(-1);
}

for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
if(strlen(dp->d_name)>10){
printf("<target>%s</target>\n",dp->d_name);
read_file(dp->d_name);
}
}
};
int main(){
filter dekita("C:/Users/usui/perl/LWP/170220-Iterative_processing/html");
}

// vim:set ft=cpp fdm=marker:

エラーの内容は下記。

01.cpp:12:2: error: 'DIR' does not name a type
DIR *dir;
^
01.cpp:14:15: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
char path[]=".";
^
01.cpp:15:6: error: redeclaration of 'int filter::ret'
int ret;
^
01.cpp:11:6: note: previous declaration 'int filter::ret'
int ret;
^
01.cpp:42:2: error: expected '}' at end of input
}
^
01.cpp:14:15: error: initializer-string for array of chars is too long [-fpermissive]
char path[]=".";
^
01.cpp: In constructor 'filter::filter(std::string)':
01.cpp:19:19: error: array used as initializer
filter(string s){
^
01.cpp:28:6: error: 'dir' was not declared in this scope
if((dir=opendir(path))==NULL){
^
01.cpp:28:22: error: 'opendir' was not declared in this scope
if((dir=opendir(path))==NULL){
^
01.cpp:29:19: error: 'perror' was not declared in this scope
perror("opendir");
^
01.cpp:33:17: error: 'dir' was not declared in this scope
for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
^
01.cpp:33:20: error: 'readdir' was not declared in this scope
for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
^
01.cpp:34:15: error: invalid use of incomplete type 'struct dirent'
if(strlen(dp->d_name)>10){
^
01.cpp:13:9: error: forward declaration of 'struct dirent'
struct dirent *dp;
^
01.cpp:34:23: error: 'strlen' was not declared in this scope
if(strlen(dp->d_name)>10){
^
01.cpp:35:38: error: invalid use of incomplete type 'struct dirent'
printf("<target>%s</target>\n",dp->d_name);
^
01.cpp:13:9: error: forward declaration of 'struct dirent'
struct dirent *dp;
^
01.cpp:35:46: error: 'printf' was not declared in this scope
printf("<target>%s</target>\n",dp->d_name);
^
01.cpp:36:16: error: invalid use of incomplete type 'struct dirent'
read_file(dp->d_name);
^
01.cpp:13:9: error: forward declaration of 'struct dirent'
struct dirent *dp;
^
01.cpp:36:24: error: 'read_file' was not declared in this scope
read_file(dp->d_name);
^
01.cpp: At global scope:
01.cpp:42:2: error: expected unqualified-id at end of input
}
^
どうも、CとC++では、関数の名前とかが違う様だが。済みません。間違いの
指摘をお願いします。

下記で、大量のエラーが出る。
//C:/Users/usui/perl/LWP/170220-Iterative_processing/html/01.cpp {{{
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>

using namespace std; // }}}

class filter{
private:
int ret;
DIR *dir;
struct dirent *dp;
char path[]=".";
int ret;
string name;
public:
// コンストラクター
filter(string s){
name = s;
const char* cstr = name.c_str();
ret=chdir(cstr);
if(ret!=0){
cout...続きを読む

Aベストアンサー

基本的には、コンストラクタの中で、static でない変数を初期化することは禁止されています(最初のメッセージは、警告メッセージで、C++11 の新規格なら許されると言うことです)

あと、C++であてtも、char path[] という配列を初期化することはできません。

ということです。


人気Q&Aランキング