0

だから私がやろうとしているのは、これらを順番にファイルに書き込むことです。「for」ループを使用することを考えましたが、i を変数として stri を使用するとコードが正しく動作しないため、その方法がわかりません。私は基本的に提案を探しているだけです。前もって感謝します。

int main(void)              //Main calls the functions.  

FILE *fp_out; 

char str1[] = "That means today is Monday! \n";
char str2[] = "That means today is Tuesday! \n";
char str3[] = "That means today is Wednesday! \n";
char str4[] = "That means today is Thursday! \n";
char str5[] = "That means today is Friday! \n";

fp_out = fopen("strings.txt", "w");

//int i;
//for (i=1; i>5; i++)
//{
//fputs(str[i]

最後の行はコメントアウトされていますが、それらは私が試みた for ループの始まりでした。

4

6 に答える 6

3

文字列ごとに異なる変数名を使用したため、(これらのポインターの配列を作成せずに) ループ内でこれを直接行うことはできません。最初に文字列を配列に入れる方が簡単な場合があります。

const char * str[5] = {
    "That means today is Monday! \n",
    "That means today is Tuesday! \n",
    "That means today is Wednesday! \n",
    "That means today is Thursday! \n",
    "That means today is Friday! \n"
};

その後、通常どおりループできます。

for( i = 0; i < 5; i++ ) fputs( str[i], fp_out );

これは、元のアプローチとは微妙に異なります。あなたのものはchar配列として宣言されているため、実際にはそれらを変更することができますが、ここで使用した文字列リテラルは一定です (constキーワードを省略しても)。とにかく、実行中にそれらを変更したくないと思います。

于 2013-06-11T00:32:27.800 に答える
2

すべての文字列を 1 つの配列に格納する場合は、for ループを使用できます。

char *strings[] = {str1, str2, str3, str4, str5};

インデックスを使用して配列を反復処理し、各文字列を個別に書き込むことができるようになりました。

int i;
for (i = 0; i < 5; ++i) {
    fputs(strings[i], fp_out);
}
于 2013-06-11T00:31:36.033 に答える
1
#include <stdio.h>

int main() {
    char *strs[] = {
      "That means today is Monday! \n",
      "That means today is Tuesday! \n",
      "That means today is Wednesday! \n",
      "That means today is Thursday! \n",
      "That means today is Friday! \n",
      0
    };
    FILE *fp_out = fopen("strings.txt", "w");
    for (char **p = strs; *p; p++) {
        fprintf(fp_out, "%s", *p);
    }
    fclose(fp_out);
    return 0;
}
于 2013-06-11T00:34:20.450 に答える
0

@paddyによる回答は次のとおりです。

const char * str[5] = {
    "That means today is Monday! \n",
    "That means today is Tuesday! \n",
    "That means today is Wednesday! \n",
    "That means today is Thursday! \n",
    "That means today is Friday! \n"
};

土曜日と日曜日を追加するとどうなりますか? 5を に変更する必要があり7ます。良いニュース: 変更を忘れると、C コンパイラは、文字列の数が配列の宣言されたサイズと異なることに気付き、エラーが発生します。

しかし、うーん。では、なぜ配列の長さを指定する必要があるのでしょうか? Cコンパイラは、どれくらいの長さであるべきかを判断できませんか?

実際、そうです。数値を省略するだけで、C コンパイラが配列内の要素の数を数え、配列を正確にそのサイズにします。

しかし、文字列を印刷するとき、文字列の数をどのように知るのでしょうか? この問題を解決するには、2 つの一般的な方法があります。

1 つは、通常「センチネル」値と呼ばれる特別なマーカーを配列の末尾に配置することです。ここでの良い選択はNULL.

それでは、例にこれらの変更を加えてみましょう: コンパイラにカウントさせ、最後にセンチネルを追加します。

@paddyによる回答は次のとおりです。

char const *str[] = {
    "That means today is Monday! \n",
    "That means today is Tuesday! \n",
    "That means today is Wednesday! \n",
    "That means today is Thursday! \n",
    "That means today is Friday! \n",
    NULL
};

これで、センチネル値をチェックするループを書き直すことができます。

for (i = 0; str[i]; ++i)
    fputs(str[i], fp_out);

str[i]これは、 の値が falseになるまでループして出力します。NULLポインターは false と評価され、ループが停止します。

リストに含まれているものの数を知るもう 1 つの方法は、もう少しトリッキーです。この機能を使用しsizeof()て配列のサイズを調べることができますが、このサイズはsizeof(char)(ほとんどのプラットフォームではバイトを意味します) 単位で与えられます。ただし、合計サイズを 1 つの要素のサイズで割ることはできます。これはうまくいきます:

static int const str_count = sizeof(str) / sizeof(char const *);

しかし、型を変更するとどうなるstrでしょうか? 次に、で変更することを忘れないでくださいsizeof(char const *)strより良いのは、要素のサイズを把握するためにそれ自体を使用できることです。そのようです:

static int const str_count = sizeof(str) / sizeof(str[0]);

これをマクロにまとめることもできます:

#define ARRAY_LEN(a)  (sizeof(a) / sizeof((a)[0]))

static int const str_count = ARRAY_LEN(str);

ループは次のとおりです。

for (i = 0; i < str_count; ++i)
    fputs(str[i], fp_out);

または、次のマクロを使用します。

for (i = 0; i < ARRAY_LEN(str); ++i)
    fputs(str[i], fp_out);
于 2013-06-11T04:42:58.577 に答える
0

他の人が示したように配列を使用することは、おそらくあなたが探しているアプローチです。ただし、<stdarg.h>、および可変数の引数を取る関数を使用することもできます。

void print_strings (FILE *fp_out, ...) {
    va_list ap;
    va_start(ap, fp_out);
    for (const char *p; (p = va_arg(ap, const char *)); /*empty*/) {
        fputs(p, fp_out);
    }
    va_end(ap);
}

/* ... */
print_strings(fp_out, str1, str2, str3, str4, str5, (const char *)0);

int関数は引数のみを想定しているため、引数が関数に入れられないようにするために、センチネル値のキャストが必要const char *です。

于 2013-06-11T01:23:33.023 に答える
-1

for5 つの個別の配列を作成する代わりに、以下を作成した場合は、ループを使用できますarray of arrays

char* strings[5];
strings[0] = "That means today is Monday! \n";
strings[1] = "That means today is Tuesday! \n";
...

次に、 for ループで を 0 から 4 の範囲strings[i]で出力する必要があります。i

于 2013-06-11T00:30:27.090 に答える