#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とする。その値もオブジェクト形式マクロとして定義する。
・文字列の配列を読み込む関数を作成する。$$$$$を読み込んだ時点で読み込みを中断・終了する。
・$$$$$より前に入力された全文字列を表示する。
この問題がわかりません。
$は不正な文字と出てしまうし、式の構文エラーも出てもうだめです。
助けてください。
文字列を読み込むプログラム
Re: 文字列を読み込むプログラム
コードを提示するときはBBCodeを有効にした(無効にしない)状態でcodeタグで囲んでいただけると、見やすくてありがたいです。
csの宣言の後にセミコロンが無いため、C言語(C99)としてコンパイルするとコンパイルエラーになりました。
ググッた結果、オブジェクト形式マクロとはC言語では の形式のマクロのようですね。
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言語では の形式のマクロのようですね。
使用しているプログラミング言語、処理系、およびそのプログラムを教えていただけますか?John Doe さんが書きました:$は不正な文字と出てしまうし、式の構文エラーも出てもうだめです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 文字列を読み込むプログラム
すみません;は書き忘れです
まだ初心者なので詳しいことはわかりませんが使用しているのはC言語、処理系はBorland C++ Compilerでいいんですかね?
そのプログラムというのはよくわからないです。
まだ初心者なので詳しいことはわかりませんが使用しているのはC言語、処理系はBorland C++ Compilerでいいんですかね?
そのプログラムというのはよくわからないです。
Re: 文字列を読み込むプログラム
#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のループを抜け出せません
なぜでしょう?
#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のループを抜け出せません
なぜでしょう?
Re: 文字列を読み込むプログラム
sと"$$$$$"が等しくなることが無かった、もしくは無いとコンパイラが判断したからでしょう。John Doe さんが書きました:こんなのを作ってみたのですが、$$$$$と打ってもscan_stringのループを抜け出せません
なぜでしょう?
C言語での文字列の比較は、strcmp関数を使うのが簡単です。
また、このプログラムでs != "$$$$$"を評価するタイミングでは、sの中身は一般に直前に入力したデータではなく、不定です。
("$$$$$"と比較しているsは「先頭要素のアドレス」になるので、不定にはならないはずです)
オフトピック
John Doe さんが書きました:・文字列の個数を3ではなく大きな数とし、その値をオブジェクト形式マクロとして定義する。
・文字列の文字数を6ではなく128とする。その値もオブジェクト形式マクロとして定義する。
John Doe さんが書きました:#define KOSU 30
#define MOJISU 128
「大きな数」という指示に対して、(少ない)文字数よりも少ない数を入れるのは、さすがにあまり良くないのでは無いかな?
この場合、「大きな数」は100000~1000000 (十万~百万)くらいがいいかな。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 文字列を読み込むプログラム
このままじゃできないってことですか?
このループ文をfor文にした場合もできませんでした・・・
strcmp関数を使わずにできないでしょうか?
このループ文をfor文にした場合もできませんでした・・・
strcmp関数を使わずにできないでしょうか?
Re: 文字列を読み込むプログラム
strcmp関数に相当する関数を自分で実装して使うか、John Doe さんが書きました:strcmp関数を使わずにできないでしょうか?
sの前から1文字ずつそれぞれ'$', '$', '$', '$', '$', '\0'に一致するかを判定する条件式を書けばできます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)