0

所以我要做的就是将这些按顺序写入文件。我想过使用'for'循环,但我不确定如何去做,因为如果我使用 stri 和 i 作为变量,代码将无法正常工作。我基本上只是在寻找建议。提前致谢。

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

如果将所有字符串存储在一个数组中,则可以使用 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

正如其他人所指出的那样使用数组可能是您正在寻找的方法。但是,您也可以使用<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 回答
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"
};

如果加上周六和周日会发生什么?您需要将 更改57. 好消息:如果您忘记进行更改,C 编译器会注意到字符串的数量与声明的数组大小不同,并且您会收到错误消息。

但是嗯。那我们为什么要指定数组的长度呢?C 编译器就不能计算出它应该对我们多长时间吗?

事实上,是的。我们所要做的就是忽略这个数字,C 编译器会计算数组中的东西的数量,并使数组正好是那个大小。

但是,当我们去打印字符串时,我们怎么知道有多少?有两种常见的方法可以解决这个问题。

一种是在数组末尾放置一个特殊标记,通常称为“哨兵”值。这里是一个不错的选择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]变为假。指针将NULL评估为假,停止循环。

知道列表中有多少东西的另一种方法有点棘手。我们可以使用这个sizeof()特性来找出数组的大小,但是这个大小是根据sizeof(char)(在大多数平台上,这意味着字节)给出的。但是我们可以将总大小除以一个元素的大小。这会起作用:

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 回答
-1

for如果不是创建五个单独的数组,而是创建了一个,则可以使用循环array of arrays

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

然后你的 for 循环需要打印strings[i]i范围从 0 到 4。

于 2013-06-11T00:30:27.090 回答