C言語で可変長から固定長に変換方法は??
ある可変長のファイルがあって、レコード長を全て40にそろいたいと思って以下のようにプログラム作りました:
・・・・・(省略)
len = strlen(buf); // fscanf使ってファイルから読みみ込んだものbufに格納
n = 40-len;
char * str = (char *)malloc(n+1);
memset(str, ' ', n);
strcat(buf,str); //レコード40バイトになるまで空白を詰めていく
fprintf(fpt,buf);//fprintf使って新しいファイルに書き込み
・・・・・・(省略)
実行してみたところ、全部40という長さになっていない、40超えるものも多数出ました。
これは何がだめですか?fprintfをつかったからだめですか?それともmalloc freeにする必要ありますか?まったく検討つかないです。どうかよろしくお願いします

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

A 回答 (9件)

>while(fgets(buf,REC,fp)!= NULL){


>len = strlen(buf);
>printf("レコード長 :%d\n",len);
>}
>結果は
>レコード長 :39
>レコード長 :2

よくあるミスです。

fgetsの2番目の引数は「文字列の終端文字であるヌル文字を格納する分を含んだ、バッファの実サイズ」を指定する事になっています。

そして、困った事に「改行文字は、文字列の文字数に含み、改行文字も読み込む」のです。

では、質問者さんのプログラムを検証してみましょう。

while(fgets(buf,REC,fp)!= NULL){
RECは40です。そのため、fgetsは「bufが一杯になる39文字までを読んで、読み込みを打ち切り、末尾にヌル文字を付加」します。

len = strlen(buf);
bufには「39文字+終端のヌル文字」が入っているので、strlenは終端のヌル文字の手前にある文字数の「39」を返し、lenは39になります。

printf("レコード長 :%d\n",len);
printfは「レコード長 :39+改行」を表示します。

while(fgets(buf,REC,fp)!= NULL){
RECは40です。そのため、fgetsは「さっき読み残した1文字と、改行文字を読んで打ち切り、末尾、つまり改行文字の後にヌル文字を付加」します。

len = strlen(buf);
bufには「読み残した1文字+改行文字1文字+終端のヌル文字」が入っているので、strlenは終端のヌル文字の手前にある文字数の「2」を返し、lenは2になります。

printf("レコード長 :%d\n",len);
printfは「レコード長 :2+改行」を表示します。

結果、質問者さんのプログラムは

レコード長 :39
レコード長 :2

を表示する事になります。

これは「意図した結果ではないが、fgets()関数の仕様通りの動作」であり「正常に動作している」のです。

単に「意図通りの引数を指定しなかった為、意図した動きをしなかっただけ」なのですね。

そういう訳で「40文字+改行1文字+終端ヌル1文字」で、バッファは42バイト必要で、fgetsには「42文字あるバッファ」と「42」を指定しなければならないのです。

レコード長の定義として「#define REC 40」と定義しているのなら、以下のように書かねばなりません。

#define REC 40
char buf[REC + 2] /* 改行文字と終端ヌル文字も格納できるように、レコード長より2文字分大きいバッファを用意しなければならない */
(途中省略)
while(fgets(buf,siziof(buf),fp)!= NULL){ /* fgetsの第2引数に定数は指定しない事。必ず「sizeof(指定したバッファ)を指定すること */
len = strlen(buf);
if (buf[len - 1] == '\n') buf[--len] = '\0'; /* 末尾に改行があるなら、末尾の改行を終端文字ヌルで上書きして取り去り、その分、lenを1減らす */
printf("レコード長 :%d\n",len);
}
    • good
    • 0

追記な訂正。



>fprintf(fpt,40,"%-40s\n",buf);



fprintf(fpt,"%-40s\n",buf);

の誤り。度々すいません。
    • good
    • 0
この回答へのお礼

ありがとうございました。私がやりたいこと的中に当たりました。早速アドバイス通りにプログラム実行してみたのです。作られたファイルをレコード長の長さを確認するため以下のプログラムを作りました。 while(fgets(buf,REC,fp)!= NULL){
len = strlen(buf);
printf("レコード長 :%d\n",len);
}
結果は
レコード長 :39
レコード長 :2
というふうになったですが、これはどいう意味か、教えて頂ければ嬉しいのですが。。。もしかしたら長さ2のところは改行と終端文字の値でしょうか?
ちなみに、C言語を詳しくなるため、お勧めの本があれば教えて頂きたいです。よろしくお願いします

お礼日時:2009/06/01 15:43

蛇足な追記。



今回のように「40文字の幅に左詰めでファイルに書く」のではなく「40文字以下の、n文字の空白文字の文字列」が欲しいなら

char * str = (char *)malloc(n+1);
memset(str, ' ', n);
str[n] = '\0';
(中略)
free(str);

でも構わないけど、もっと簡単に

char *str;
str = " (ここに空白を40文字並べる:注参照) " + 40 - n;

でOK(但し、strが指す文字列は読み込み専用なので書き換えできない)

注:このサイトで投稿すると「連続した複数の半角空白」は「1つの半角空白」に勝手に直されて投稿されるので40個の空白を並べて書けません。実際にプログラムに書く時は「40個の空白を並べて」書いてください。
    • good
    • 0

>これは何がだめですか?



strにn文字分の' 'を埋め込むまでは良いが、そのstrに終端文字の'\0'を付けてないのがダメ。

厳しい事を言えば、fscanfを使うのもダメだし、memsetを使うのもダメだし、mallocを使うのもダメだし、mallocがエラーを返してくるのをチェックしてないのもダメだし、ちゃんとfreeしているか明記してないのもダメ。

で、どうして失敗しているのかと言うと、例えば
1行目が30文字
2行目が20文字
3行目が35文字
だったとしよう。

1行目は、nが40-30で10、+1して11文字のバッファがmallocで返される。

そこに10文字の' 'を埋める。

運良く、mallocが返したメモリは「最初は全部ゼロで埋まってる」ので、strには「10文字の空白+終端文字を意味する運良く最初からあったゼロ」が出来る。

それを「30文字のbufにstrcatする」ので「30文字+10文字」になる。

そして、使い終わったstrはfree(str);で開放される(けど、そのメモリには10文字の空白が残ってる)

一見、1行目は正しく動く。

2行目は、nが40-20で20、+1して21文字のバッファがmallocで返される。

そこに20文字の' 'を埋める。

運良く、mallocが返したメモリは、さっき使ったメモリと同じ場所なので「10文字の空白と、11文字目以降全部ゼロで埋まってる」ので、strには「20文字の空白+終端文字を意味する運良く最初からあったゼロ」が出来る。

それを「20文字のbufにstrcatする」ので「20文字+20文字」になる。

そして、使い終わったstrはfree(str);で開放される(けど、そのメモリには20文字の空白が残ってる)

一見、2行目も正しく動く。

3行目は、nが40-35で5、+1して6文字のバッファがmallocで返される。

そこに5文字の' 'を埋める。が、そこには「前回mallocして、使用後にfreeした、使い終わったメモリの残骸」があるので、その残骸には「既に20文字の空白が埋まっている」ので、5文字の' 'を埋めても意味は無い。

残念ながら、mallocが返したメモリは、さっき使ったメモリと同じ場所なので「20文字の空白と、21文字目以降全部ゼロで埋まってる」ので、strには「20文字の空白+終端文字を意味する運良く最初からあったゼロ」が出来る。空白を5文字しか埋めてないのに。

それを「35文字のbufにstrcatする」ので「35文字+20文字」になる。5文字の空白を足すつもりで、終端文字を付け忘れた所為で、20文字の空白が足されちゃう訳だ。

そして、使い終わったstrはfree(str);で開放される(けど、そのメモリには20文字の空白が残ってる)

そして、質問者さんは

>全部40という長さになっていない、40超えるものも多数出ました。

って悩む事になる。

とりあえずの修正なら

memset(str, ' ', n);

の直後に

str[n] = '\0';

ってのを追加すれば大丈夫。

で、mallocとかstrlenとかmemsetとか使わず、最も簡単に済ます方法は、以下の通り。

char buf[260] /* scanfを行うのに充分な大きさを確保しておく。もちろん、buf[41]ではダメ */
・・・・・(省略)
buf[40] = '\0'; /* 元々のbufが40文字以上だった時に41文字目以降を捨てる。これを忘れると41文字以上の行が出来てしまう */
fprintf(fpt,40,"%-40s\n",buf); /* 左揃えで40文字の幅に書き込めば終わり */

で、本当の所を言うと「buf[40] = '\0';の処理で、行末で40バイトに切り捨てる際に、漢字などの2バイト文字の後半バイトだけ切り捨ててしまう」と言う事が起きないように「レコードの末尾に2バイト文字の先頭バイトだけ残る場合は、それを空白に置き換える」と言う処理も必要だったりする。

以下蛇足。

冒頭の「fscanfを使うのもダメ」な理由。

もし「入力ファイル名の指定を間違えて、読みこんだファイルがテキストファイルじゃなく、空白文字や改行コードが出てこないバイナリファイルだった」としたら、scanfは何文字のデータをbufに入れようとするだろう?

「うっかり、5メガバイトある動画ファイル」を入力に指定したら?そして、その5メガバイトの中に「空白文字や改行コードが1つも無い」としたら?

scanfは、言われた通り、bufに「空白文字や改行コードが現れるまで読みこもう」とするだろう。

そして「bufのアドレスに5メガバイトのデータを読み込もう」として、プログラムが落ちてしまう。メモリをグチャグチャに壊したままで。

なので「絶対の保障」が無い限り、scanfやfscanfは使っちゃいけない。
    • good
    • 0

単に、


fprintf(fpt,"%-40s\n",buf);
でいいんじゃないかと。
    • good
    • 0

#include <stdio.h>


#include <string.h>

#define BUFSIZE 10000
#define WIDE 40

int main(int argc, char *argv[])
{
FILE *fp;
char buf[BUFSIZE];
int n;
if (argc == 1) {
fprintf(stderr, "USAGE: %s <input>\n", argv[0]);
return 1;
}
if (NULL == (fp = fopen(argv[1], "r"))) {
perror("fopen error");
return 1;
}

while (NULL != fgets(buf, BUFSIZE, fp)) {
while (buf[strlen(buf)-1] == '\n' || buf[strlen(buf)-1] == '\r') {
buf[strlen(buf)-1] = '\0';
}
for (n = strlen(buf); n < WIDE; n++) {
buf[n] = ' ';
}
buf[WIDE] = '\n';
buf[WIDE+1] = '\0';
fprintf(stdout, "%s", buf);
}
return 0;
}

ポイントは文字列の長さと改行コード'\n'と終端文字'\0'
    • good
    • 0

質問の内容も、何をやりたいのかも、何故やりたいのかも、何がわからないのかも、


伝わってきません。

ひとつひとつ整理していってください。

●目的。

●理由。

●わかっている事。

●わからない事。

●期待する動作。

●現状どうなっているのか。


> 可変長から固定長
可変長、固定長と書かれていますが、何を指していますか?
可変長、固定長がどい言うものか理解していますか?

> ある可変長のファイルがあって、
これは、何かのデータを格納してあるテキストファイルか何かですか?

> レコード長を全て40にそろいたい
どう言うファイルレイアウトを想像していますか?
ファイル仕様書にはどう定義されていますか?

> 実行してみたところ、全部40という長さになっていない、40超えるものも多数出ました。
どのようにして確認しましたか?

> fprintfをつかったからだめですか?
ファイルの書式によります。
ファイル仕様書にしたがってください。

> それともmalloc freeにする必要ありますか?
判断にあたいするだけの情報が提供されていないようです。
これでは、回答できません。

> まったく検討つかないです。
状況を整理する事からはじめてください。
わかっている事とわかっていない事の切り分けなど進めると、
もう少し有効的な質問が書ける様になるかと思います。

●以下憶測で作成したサンプルプログラムです。
----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
  char input_filename[] = "input.txt";
  char output_filename[] = "output.bin";
  FILE *pInputFile = NULL;
  FILE *pOutputFile = NULL;
  char inputBuffer[1024];
  char editBuffer[40];
  int editBufferLen = 0;
  
  /*
   * ●ファイルを開く
   */
  pInputFile = fopen(input_filename, "r");
  if (pInputFile == NULL)
  {
    perror("入力ファイルを開けませんでした.");
    exit(1);
  }
  pOutputFile = fopen(output_filename, "wb");
  if (pOutputFile == NULL)
  {
    perror("出力ファイルを開けませんでした.");
    fclose(pInputFile);
    exit(1);
  }
  
  /*
   * ●ファイルの行毎に処理するためのループ処理
   * ファイル終端に達するまで、繰り返し処理する。
   */
  while (fgets(inputBuffer, sizeof(inputBuffer), pInputFile) != NULL)
  {
    /*
     * ●1行毎の処理
     */
    
    sscanf(inputBuffer, "%s", editBuffer);  /* 行末の改行コードを除去 */
    editBufferLen = strlen(editBuffer);
    memset(editBuffer + editBufferLen, ' ', sizeof(editBuffer) - editBufferLen);
    fwrite(editBuffer, 40, 1, pOutputFile);
  }
  
  /*
   * ●ファイルを閉じる
   */
  fclose(pInputFile);
  fclose(pOutputFile);
  
  return 0;
}
----------------------------------------------------------------------
    • good
    • 0

あぁ。

それ以前にlenの中身は変なのが入っているんじゃ。。。

それと、ついでなので、
コーディングスタイルとして、n のサイズはチェックした方がよいですね。
    • good
    • 0

単純に、改行コードを出力していないからじゃないですか?



fputs() を利用するか、fprintf(fpt,"%s\n", buf)としてみてください。

あと。strcat()は文字列の連結なので、memcpy()を利用した方がよいと思いますよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。memcpyで試してみたいと思います。

お礼日時:2009/05/28 23:17

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

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

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

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

Qスポーツ 長距離 体の変化 

中学三年生の女子です
昔(小学生のころ)は持久走がずっと一番で
短距離も長距離も周りの人より早かったです。
でも、中学生に入学してから中学二年生の秋くらいまでは、
いつも通り、長距離は一番でした
でも、ある日同級生のライバルに抜かされてしまいました
それから、ずっと抜きかえすことはできず今に至ります。
自信がないのかもしれません、昔のように走りたいです
これは、体の変化もあるのですか?
生理は、みんなよりとても早く来ました5年生の1月とかに来ました。
そういう体の変化で遅くなるんですかね?
ちなみに一年生のころに比べて1分くらいは落ちています。
メンタル的な問題なのでしょうか?それとも、身体の問題なのでしょうか?
そのような経験のあるかたや、アドバイスをしてくれるかた
どうか助けてください。

Aベストアンサー

一般的に言って中学生になると、女性は体に脂肪が増えるので、伸び悩む時期だと思います。あなたは陸上部ですか?体が不利になる以上のトレーニングをできない限り、遅くなるのが普通だと思います。体の変化には個人差があるので、ライバルが有利になっているのかもしれません。

回答が集まらないのはおそらく、あなたが(また、ライバルが)どんなトレーニングをどの程度しているかがわからないからだと思います。タイムが1分遅くなったというのが何mの記録なのかも不明。

以上を具体的に書いた上でトレーニング方法を質問すれば、長距離走の経験者から具体的な回答があるのではないかと思います。

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む

Q食物や細菌、ウイルスや病気により、人の遺伝子は長い時間を経て変化してい

食物や細菌、ウイルスや病気により、人の遺伝子は長い時間を経て変化していくのだろうか?

Aベストアンサー

食物や細菌、ウイルスや病気が、自然選択の一因になっているのは確かなことです。

Qデータ型charの buf[ ]で「[ ]」に可変の数値を入れたい

以下の質問にお答え願います。
「#define SUUJI1123」で定義した時、
「char buf[SUUJI1];」の、「SUUJI1」は当然「123」であり、「char buf[123];」であることが言えます。

上記の例では、常に「SUUJI1」の値は「123」の固定であり、変わる事はありません。

では次の例で、SUUJI1の中味を場合によって可変にしたいのですが、例えば、「SUUJI1」の値を「123」ではなく、「777」にしたい時、int型「i」という変数を用いて、
「i = 777;」として、「char buf[i];」とした時、「error C2057: 定数式が必要です。」「error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。」とコンパイルエラーが出ました。

場合によって配列の数を変えたい時、どのようなやり方でプログラムを組めば良いのか教えて下さい。

Aベストアンサー

Cコンパイラならmalloc(ライブラリはstdlib.h)で領域を確保、戻り値のポインタ(char*)を使用。
用済みになったらfreeで解放。

C++であれば new char[i + 1] で領域を確保、同じく戻り値のポインタ(char*)を使用。
用済みになったらdelete []で解放。

他の皆さんの言うとおり、単純な配列に対して、動的な領域変更は許可されません。
新しいサイズの領域を確保した後、古い領域を解放する必要があります。

#STLのvectorを使用する場合、便利なメソッドが多々用意されています。

参考URL:http://www.cprogramming.com/tutorial/stl/vector.html

Q最近よく左耳が、「長い間エレベーターに乗ると(気圧の変化?)なる変な感

最近よく左耳が、「長い間エレベーターに乗ると(気圧の変化?)なる変な感じ」になり、聞こえが悪くなります。
鼻をすすってもなると聞いたので注意しているのですが、普通にしていてもなります。
一度耳鼻科で診てもらいましたが、鼓膜は正常でした。
特に風邪はひいていません。
耳鳴りはしません。
毎日電車で通学しているのですが関係あるでしょうか?
もう一度診てもらうのが一番だとは思いますが、しばらく時間も取れそうにないので参考意見を寄せて頂けると光栄です。

Aベストアンサー

体質的に耳管狭窄(じかんきょうさく)になり易いのだと思います。
下の回答のご指摘通り、耳の中耳腔と鼻・喉を繋ぐ耳管の開きが悪い状態です。

耳管狭窄の主な原因は、風邪やアレルギーによる鼻・喉の炎症です。これが無いのに症状が出るなら、他に体質的な要因があると考えられます。

(1)胃酸過多
ゲップで胃酸が上がって来る事は無くても、神経反射で上気道炎を起こします。風邪を引いていないのに喉奥がヒリヒリ・カサカサしたり、つっかえ感があります。
胃酸過多の原因は、ストレスによる自律神経の亢進、ピロリ菌です。何か薬を服用して胃炎を起こしたり、前屈みの姿勢が多いだけでも、胃酸過多になります。

(2)気圧差
航空中耳炎や潜水性中耳炎は、重症の耳管狭窄症です。

(3)低血圧、浮腫み、冷え、首や肩の凝りがると耳管狭窄になり易いです。

(4)生れ付き耳管が細かったり、耳管機能が弱い人もいます。加齢によっても耳管機能は衰えます。

(5)入浴・飲酒後、朝起き掛けは身体が浮腫むので、症状が出易くなります。

一度、耳鼻科で耳管機能検査を受けてみたらどうでしょうか?(まだ設備のある病院は少ないですが、大学病院でなくてもあります。)
耳管狭窄が重症化すると、滲出性中耳炎になったり、鼓膜が凹んで低音域の聞こえが悪い軽度難聴(40dB位)になる事もあります。
鼓膜の凹みは、真珠腫(慢性中耳炎)の原因にもなるので、注意された方が良いです。お大事に。

体質的に耳管狭窄(じかんきょうさく)になり易いのだと思います。
下の回答のご指摘通り、耳の中耳腔と鼻・喉を繋ぐ耳管の開きが悪い状態です。

耳管狭窄の主な原因は、風邪やアレルギーによる鼻・喉の炎症です。これが無いのに症状が出るなら、他に体質的な要因があると考えられます。

(1)胃酸過多
ゲップで胃酸が上がって来る事は無くても、神経反射で上気道炎を起こします。風邪を引いていないのに喉奥がヒリヒリ・カサカサしたり、つっかえ感があります。
胃酸過多の原因は、ストレスによる自律神経の亢進...続きを読む

QGetModuleFileName(他のアプリ, buf, 255);

HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hWndElse, GWL_HINSTANCE);
GetModuleFileName(hInst, buf, 255);

というソースで、buf[0] が 0 でした。

GetWindowText( ) のように、GetModuleFileName( ) も
他のアプリに対しては 0 を返すんですか?

Aベストアンサー

GetModuleFileName() のヘルプを見ると、第一引数の型は HMODULE でモジュールハンドルを
渡すことになってます。

それなのにインスタンスハンドルを渡しているからエラーになっているのでしょう。

GetModuleFileName() 関数の戻り値と GetLastError() を使って詳細の情報を
取得して、ヘルプを参照して見てください。

Q友人の変化(長いし、愚痴です。)

長年友人としてつきあってきたのですが、ここ数年お互いが変わってきたのでしょうか?
どんな方法(電話 メール 手紙)でも彼女と連絡をとるたびにいやな気分になります。
「友達やめたらいいのに」とお思いの方もいるとおもいますが、けれども10数年共にしてきた友人。いつかは変わるはず、とこのまま関係を続けるつもりです。しかし疲れます。この疲れを切り替える方法や考え方
があれば、お教えください。またこういう体験をされた方のご意見も聞きたいです。

彼女は「自分が大好き」な人のようです。
たとえば仕事が大変なようで、会えば自分の仕事の愚痴をひっきりなしにしゃべり、私のことを「愚痴をぶつけるサンドバック」とまでこき下ろされたり。

こちらが電話するとぶっきらぼうに対応され、近況を知らせても「あーそう」
一時私の方が仕事で疲れすぎて体調を壊したとき、
やっと体調が戻り、会ったときに言われたひとこと
「私も気をつけよう」体調の様子を説明すると「そんな症状が出ておもしろいね。」
(さすがにこのときは本当に心がさめました。)

とはいえ、学生時代をともにしてきたので、当時は上
に述べたようなところは一切なく、真面目で頑張り屋さんなところなどいいところがいっぱいあったし、「彼女のような人になりたい!」と思って努力したこともありました。私も思い込んでたのかな。

しかしここ数年「自分大好き」人間に拍車がかかり
私が黙っていれば言葉をぶつけるような会話。

会う回数を減らし、年に一回くらいにすることにしています。

長年の友人関係なので、だらだらとこのまま続けようとは思っているのです。「人の欠点は自分の欠点」と
思いますし、10数年も付き合っているとお互いのあらなんかも見えてしまう時期かもしれませんので。

でも、疲れるなぁ・・・。

だらだらとすみません。読んでくださった方ありがとう。

長年友人としてつきあってきたのですが、ここ数年お互いが変わってきたのでしょうか?
どんな方法(電話 メール 手紙)でも彼女と連絡をとるたびにいやな気分になります。
「友達やめたらいいのに」とお思いの方もいるとおもいますが、けれども10数年共にしてきた友人。いつかは変わるはず、とこのまま関係を続けるつもりです。しかし疲れます。この疲れを切り替える方法や考え方
があれば、お教えください。またこういう体験をされた方のご意見も聞きたいです。

彼女は「自分が大好き」な人のようです。
...続きを読む

Aベストアンサー

長い付き合いだからこそボロが出てきたのでは?
私だったらこっちから連絡しませんね
もし相手から連絡きても同じような対応して返しますよ
「そっか。大変だね」位が限度かな?

憧れていた部分は“そんな人もいたな”と心に閉まって置いて本人自体の事は忘れてはどうでしょうか?

人と付き合うのに疲れる事もありますが、あまりにも自分勝手過ぎるのはどうかとおもいますね、
「愚痴をぶつけるサンドバック」なんて友人に言う言葉でしょうか?『愚痴に付き合ってくれる人』じゃなく人ですらないですからね

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Q電解還元水を長く飲んでいる方、飲む前と今の変化は?

電解還元水生成器(一社しか作ってない?)を購入したいのですが、実際に使っている方の効能を教えていただきたいのですが。

Aベストアンサー

医療関係者です。
水について いろんな本を読んだり 購入してきました。
S60前 アルファー・・・から還元水素水などの 名称のものまで、
結論は 購入し始めは 貪欲に飲むので 体内の水不足・水代謝が良くなるため 一時期症状が改善されるが、慣れてマンネリ化し 水をあまり飲まない状態になると 元の症状が 出てくるようです。
いろんな名前がありますが、根拠に乏しいものが多いようです。
下記URL参照してください。
現在は 活性酸素除去を目的とし、4箇所の大学病院・癌研などで研究中の試作品を使用し、アレルギー・腫瘍マーカーなどに対してテスト中ですが 今のところ順調に良い結果が出ています。
後、1・2年いろんなケースでテスト(偽薬も含め)し結果次第で各飲料メーカーから応用製品(ドリンクなど)が出るものと思われます。
今、テスト機関とメーカーで調整段階ですので楽しみにお待ちください。
安くて 効果があり、メンテナンス・消耗品代など格安、ウサンクサイ付き合い無しで購入できる良い品・器具を探してください。
いつも 心に 「私は元氣Da!・ありがとう」と念じて 感謝し 湯冷ましを飲むだけで 現状は改善しますよ! 

参考URL:http://atom11.phys.ocha.ac.jp/wwatch/intro.html

医療関係者です。
水について いろんな本を読んだり 購入してきました。
S60前 アルファー・・・から還元水素水などの 名称のものまで、
結論は 購入し始めは 貪欲に飲むので 体内の水不足・水代謝が良くなるため 一時期症状が改善されるが、慣れてマンネリ化し 水をあまり飲まない状態になると 元の症状が 出てくるようです。
いろんな名前がありますが、根拠に乏しいものが多いようです。
下記URL参照してください。
現在は 活性酸素除去を目的とし、4箇所の大学病院・癌研などで研究中の試...続きを読む

Qstr_[LEN+1]とは?

今、自分はc言語の勉強をしているの者なのですが
#include<strio.h>
#include<string.h>

#define LEN 100
int main()
{
char str_a[LEN+1]="";
char str_b[LEN+1]="";


この文のchar str_a[LEN+1]が何を表しているかが分かりません、教えてください!!

Aベストアンサー

文字列の終わりを示す為に、文字列の最後に'\0'を追加します。
その為に、文字配列を確保する際は、文字数に+1した物を確保
する必要があります。


人気Q&Aランキング

おすすめ情報