ここから質問投稿すると、最大4000ポイント当たる!!!! >>

C言語で文字列を扱う時、配列に1文字ずつ格納していくか、ポインタ変数を使うと思うのですが、
ポインタ変数を使った場合の処理が上手くできずに困っています。

詳細を説明すると、値を取得して、前回取得した値と比較します。
それで、同じだった場合には"chritm1"に格納した矢印を書き込む処理なのですが、
現在はfor文により配列に格納したものを使用していますが、
この部分をポインタ変数を使用した処理(1文字1文字書くのではなく、string型変数の用に書き込みたい)
に変更したいのですが、上手くできないという状況です。

何かとっかかりとなるようなことでもかまいませんので、教えてください。
よろしくお願いします。


static int mainA(
char *fileName){

int loop, i, j;
FILE *fd;

/* 前回値格納用 */
char *preval;
/* 現在値格納用 */
char *thisval;
/* 同値用記号格納用 */
char chritm1[6] = " → ";

-- 中略 --

for( i = 0 ; i < 150 ; i++ ) {
thisval = redata[i];
/* 値の比較 */
if(preval == thisval) {
for( j = 0 ; j < 6 ; j++){
/* 前回値と同じ場合は矢印 */
fprintf( fd, ",%c",chritm1[j]);
}
}else{
/* 前回値と異なる場合は値 */
fprintf( fd, ",%s", thisval);
}
preval = thisval;
/*完了したら改行 */
fprintf( fd, "\n" );
}

-- 以下略 --

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

A 回答 (2件)

 たぶん次の1行が答えと思います。

(",%c"という記述があるので,for文の処理とは同じ結果になりませんが問題ないはず。)

fprintf( fd, ",%s", chritm1 );

 また、値の比較として「if(preval == thisval)」としていますが正常に動作しない気がします。
 値が文字列として格納されているのであればstrcmp()関数で比較するか一度数値に変換して比較する必要があります。
    • good
    • 0
この回答へのお礼

ご指摘いただいた点を修正したら出力することができました。
出力形式を変えればよかったんですね。
本当にありがとうございました。

お礼日時:2009/10/06 02:28

if (preval == thisval)


このif文はprevalの値とthisvalの値を比較しています。
双方の値(どこかを指しているアドレス値)は通常異なります。
このif文の結果は偽となります。

prevalが指している文字列の内容とthisvalが指している文字列の内容が一致しているかどうかを確認するときは

if (strcmp(preval, thisval) == 0)

と書きます。
    • good
    • 0
この回答へのお礼

ホントですね。。。
int型みたいな感じで使ってしまってました。
教えていただいてありがとうございました。

お礼日時:2009/10/06 02:33

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

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

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

Q戻り値の意味がわかりません…

戻り値とはどういう値なのか簡単な例文で教えて頂けますか?

Aベストアンサー

バカくさいかもしれませんが簡単な例えをだしてみます。
2人の子供がいて、名前をそれぞれ太郎・花子にしましょう。この2人の子にある役割を決めます。
・花子は飴をもらうと、それをチョコにする役割。(できるかは別として)
・太郎は花子を呼んで飴をあげる役割。

さてこの例では太郎の飴が引数(ひきすう)になり
花子のチョコが戻り値になります。

このイメージを元に次の文を読んでみてください。

「プログラム中の関数やサブルーチンが処理を終了し
呼び出し元に処理の結果として返す値。」

これが戻り値の正しい定義です。
そのほかにはNo1さんのような役割指すときも、それを「戻り値」と呼んだりします。

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

QC ファイル出力で、フォルダがない場合でも作成する方法

先日、皆さんに教えていただき

Cで出力ファイルを指定のフォルダに出す方法が上手く出来ました。
具体的には、↓こうやって指定しました。
sprintf( buff, "%s\\%s", path, filename );

やっていて思ったのですが、
この方法だと、指定フォルダが最初から無いとエラーが出てしまいます。
フォルダが無かったら、作成し、その中にファイルを出力していってくれる。という方法はできるものなのでしょうか?

もしできるようなら教えて下さい!!
よろしくお願いします!

Aベストアンサー

★回答ではないが余談。
・koko_u_ さんありがとう。
 気づくとアンダーバーの関数名で置き換わっているみたいですね。
 他にも気づくといろいろ置き換わっていますね。
 C 関数、最近使っていないのでアンダーバーの関数名で調べてみます。
・ありがとうございました。

●質問者さんへ。
・_mkdir() 関数が使える場合はその関数でもフォルダ(ディレクトリ)が作成できます。
 それでは。

参考URL:http://www5c.biglobe.ne.jp/~ecb/c/12_14.html

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

Qint型配列の一括初期化

現在、ある配列をfor()でループさせて初期化させていますが、もっと高速に初期化できる方法はないでしょうか?

//配列の初期化
int Xi[256];

for(i = 0; i < 256; i++){
   Xi[i] = 0;
}

今後、配列数を増やす予定なので高速に初期化できるものはないか探しています。
速度重視でよろしくお願いします。

Aベストアンサー

全ての要素が0で初期化された配列を確保したいのであれば、calloc()を使うというのはどうでしょうか? 上記のコードより速いという保証はありませんが。

#include <stdlib.h>
int *Xi = (int *)calloc(256, sizeof(int));

配列が不要になった時点でfree(Xi)するのをお忘れなく。また、初期値が0以外の場合にはこの手は使えません。

QC++で、テキストファイルを一行ずつ読み込んで配列に入れたいのですが、

C++で、テキストファイルを一行ずつ読み込んで配列に入れたいのですが、うまくできません!

テキストには -3.0
       1.0
       2.0

・・・などのように一行に一つの数値が入って縦に並んでいます。
それをひとつずつ読み込み、新しい配列(たとえばa[])に順番にいれたいのです。

a[1]=-3.0,a[2]=1.0、・・・と
なるように。

どうか、この初心者にご指導お願いいたします。

Aベストアンサー

fgetsは文字列として読み込みます。これを数値に変換すれば、とりあえずあなたが望んでいることができます。変換はatofを使います。また、atofを使用するときは#include <stdlib.h>が必要です。
例えば
#include <stdlib.h>
  :
double d;
  :
d=atof("-3.0");
とすると、文字列の-3.0が数値の-3.0に変換されdに入ります。

fscanf関数で読み込んでもできますが、書式とデータがあっていないと上手くいかないので注意してください。

Qtxtファイルの文字を配列に格納

ファイル関数を使ってoutput.txt(txtファイル)の文字を配列に格納するプログラムを作っているのですが、配列に文字を入れられない状態です。
※参考になるページやアドバイスがあれば宜しくお願い致します。

■プログラム
#include <stdio.h>

void main(){
int i;
int data[10];
FILE *fp;
fp = fopen("output.txt","r");
if(fp == NULL){
printf("ファイルが見つかりません。");
}else{
for(i=0;fp != EOF;i++){
data[i] = fgetc( fp );
}
}
}

■output.txt
001 100 猫A 好きな物 ねこまんま
002 200 猫B 好きな物 キャットフード

Aベストアンサー

これで、やりたいこと、できませんかね?
++++++++++++++++++++++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
int i = 0, j = 0;
char temp, data[10][100];
FILE *fp;
fp = fopen("output.txt","r");
/* 初期化 */
memset(data, 0, sizeof(data));

if(fp == NULL){
printf("Cannot find file");
}else{
while((temp = fgetc(fp)) != EOF){
if (temp == ' ' || temp == '\n') {
data[i][j] = '\n';
i++;
j = 0;
} else {
data[i][j] = temp;
j++;
}
}
for (i = 0; i < 10; i++) {
printf("[%d] Output : %s \n", i, data[i]);
}
fclose(fp);
}

return 0;
}
++++++++++++++++++++++

これで、やりたいこと、できませんかね?
++++++++++++++++++++++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
int i = 0, j = 0;
char temp, data[10][100];
FILE *fp;
fp = fopen("output.txt","r");
/* 初期化 */
memset(data, 0, sizeof(data));

if(fp == NULL){
printf("Cannot find file");
}else{
while((temp = fgetc(fp)) != EOF){
if (temp == ' ' || temp == '\n') {
data[i][j] = '\n';
i++;
j = 0;
} else {
data[i][j] = temp;
j++;
}...続きを読む


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

人気Q&Aランキング