文字列を読み込むプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
John Doe

文字列を読み込むプログラム

#1

投稿記事 by John Doe » 10年前

#include<stdio.h>

void put_strary(const char s[][6],int n)
{
int i;
for(i = 0;i < n;i++)
printf("s[%d] = \"%s\"\n",i,s);
}

int main(void)
{
char cs[][6] = {"Turbo", "NA", "DOHC"}

put_strary(cs,3);

return 0;
}

↑このプログラムを以下のように書き換えたプログラムを作成せよ。
・文字列の個数を3ではなく大きな数とし、その値をオブジェクト形式マクロとして定義する。
・文字列の文字数を6ではなく128とする。その値もオブジェクト形式マクロとして定義する。
・文字列の配列を読み込む関数を作成する。$$$$$を読み込んだ時点で読み込みを中断・終了する。
・$$$$$より前に入力された全文字列を表示する。

この問題がわかりません。
$は不正な文字と出てしまうし、式の構文エラーも出てもうだめです。
助けてください。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字列を読み込むプログラム

#2

投稿記事 by みけCAT » 10年前

コードを提示するときはBBCodeを有効にした(無効にしない)状態でcodeタグで囲んでいただけると、見やすくてありがたいです。
John Doe さんが書きました:#include<stdio.h>

void put_strary(const char s[][6],int n)
{
int i;
for(i = 0;i < n;i++)
printf("s[%d] = \"%s\"\n",i,s);
}

int main(void)
{
char cs[][6] = {"Turbo", "NA", "DOHC"}

put_strary(cs,3);

return 0;
}

csの宣言の後にセミコロンが無いため、C言語(C99)としてコンパイルするとコンパイルエラーになりました。

John Doe さんが書きました: ・文字列の個数を3ではなく大きな数とし、その値をオブジェクト形式マクロとして定義する。
・文字列の文字数を6ではなく128とする。その値もオブジェクト形式マクロとして定義する。

ググッた結果、オブジェクト形式マクロとはC言語では

コード:

#define HOGE fuga
の形式のマクロのようですね。
John Doe さんが書きました:$は不正な文字と出てしまうし、式の構文エラーも出てもうだめです。
使用しているプログラミング言語、処理系、およびそのプログラムを教えていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

John Doe

Re: 文字列を読み込むプログラム

#3

投稿記事 by John Doe » 10年前

すみません;は書き忘れです
まだ初心者なので詳しいことはわかりませんが使用しているのはC言語、処理系はBorland C++ Compilerでいいんですかね?
そのプログラムというのはよくわからないです。

John Doe

Re: 文字列を読み込むプログラム

#4

投稿記事 by John Doe » 10年前

#include<stdio.h>

#define KOSU 30
#define MOJISU 128

int scan_string(char s[][MOJISU])
{
int i = 0;

puts("文字列を入力してください.");
do
{
printf("s[%d] :",i);
scanf("%s",s[i]);
i++;
} while(s[i] != "$$$$$");

return i;
}

void put_strary(const char s[][MOJISU],int n)
{
int i;
for(i = 0;i < n;i++)
printf("s[%d] = \"%s\"\n",i,s[i]);
}

int main(void)
{
int idx;
char s[KOSU][MOJISU];

idx = scan_string(s);
put_strary(s,idx-1);

return 0;
}

こんなのを作ってみたのですが、$$$$$と打ってもscan_stringのループを抜け出せません
なぜでしょう?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字列を読み込むプログラム

#5

投稿記事 by みけCAT » 10年前

John Doe さんが書きました:こんなのを作ってみたのですが、$$$$$と打ってもscan_stringのループを抜け出せません
なぜでしょう?
sと"$$$$$"が等しくなることが無かった、もしくは無いとコンパイラが判断したからでしょう。
C言語での文字列の比較は、strcmp関数を使うのが簡単です。
また、このプログラムでs != "$$$$$"を評価するタイミングでは、sの中身は一般に直前に入力したデータではなく、不定です。
("$$$$$"と比較しているsは「先頭要素のアドレス」になるので、不定にはならないはずです)

オフトピック
John Doe さんが書きました:・文字列の個数を3ではなく大きな数とし、その値をオブジェクト形式マクロとして定義する。
・文字列の文字数を6ではなく128とする。その値もオブジェクト形式マクロとして定義する。
John Doe さんが書きました:#define KOSU 30
#define MOJISU 128

「大きな数」という指示に対して、(少ない)文字数よりも少ない数を入れるのは、さすがにあまり良くないのでは無いかな?
この場合、「大きな数」は100000~1000000 (十万~百万)くらいがいいかな。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

John Doe

Re: 文字列を読み込むプログラム

#6

投稿記事 by John Doe » 10年前

このままじゃできないってことですか?
このループ文をfor文にした場合もできませんでした・・・
strcmp関数を使わずにできないでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字列を読み込むプログラム

#7

投稿記事 by みけCAT » 10年前

John Doe さんが書きました:strcmp関数を使わずにできないでしょうか?
strcmp関数に相当する関数を自分で実装して使うか、
sの前から1文字ずつそれぞれ'$', '$', '$', '$', '$', '\0'に一致するかを判定する条件式を書けばできます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る