C:基于先前输入的多行输入

C:基于先前输入的多行输入,c,C,所以我要做的就是把用户写的东西转换成文本文档。但是,行的数量会有所不同。它将始终是3列 这是程序运行的一个示例: How many jobs?: 4 Enter processing time for each: 10 13 12 20 39 10 7 29 13 13 18 19 因为用户为作业数输入了“4”。有4个不同的行供用户输入。我想保存此输入,以便在程序完成后生成此输入的文本文档 我的代码中有这样一部分: int jobs; printf("How many jobs?: "); s

所以我要做的就是把用户写的东西转换成文本文档。但是,行的数量会有所不同。它将始终是3列

这是程序运行的一个示例:

How many jobs?: 4
Enter processing time for each: 10 13 12
20 39 10
7 29 13
13 18 19
因为用户为作业数输入了“4”。有4个不同的行供用户输入。我想保存此输入,以便在程序完成后生成此输入的文本文档

我的代码中有这样一部分:

int jobs;
printf("How many jobs?: ");
scanf("%d", &jobs);

int ptimes[jobs];
int n = 0;
printf("Enter processing time for each: ");

for (ptimes[0]; ptimes[jobs] ; ptimes[jobs++]) {
     scanf("%d", ptimes[n]);
     n = n + 1;

    }

我的问题是,我不能将每个号码单独存储在一行中。此外,我不能做3列。而且,这段代码对我来说也不能正常工作。我通过添加一个条件相同的for循环进行测试,但在ptimes中打印每个变量,但它不起作用。

尽管您的
for
循环毫无意义,但您正在以一种非常尴尬的方式处理问题。当您的目标是读取一行数据时,您应该考虑使用面向行的输入函数,而不是读取单个整数

例如,如果用户想要为4个作业输入数据,那么您可以读取并验证每个作业的3个整数,或者只需要在一行中输入每个作业数据,然后读取该行并将该行写入文件

您只需提供一个足够大的缓冲区来容纳用户在每行输入的所有预期字符(不要忽略缓冲区大小)。然后,只需使用一个面向行的输入函数(如
fgets
或POSIX
getline
)读取每一行,然后使用
fputs
将该行写回输出文件中(
fgets
fputs
在这里是一个很好的组合)

例如,为了尽可能少地处理您的情况,您可以:

#include <stdio.h>

#define MAXC  1024
#define OFILE "jobs.txt"

int main (void) {

    char buf[MAXC];
    int nlines = 0, n = 0;
    FILE *fp = fopen (OFILE, "w");

    if (!fp) {  /* validate file is open for writing */
        perror ("fopen-file open failed");
        return 1;
    }

    printf ("How many Jobs? ");
    if (scanf ("%d", &nlines) != 1) {
        fputs ("error: invalid integer input.\n", stderr);
        return 1;
    }
    fgets (buf, MAXC, stdin);   /* read and discard trailing '\n' */

    while (n < nlines && fgets (buf, MAXC, stdin)) { /* read lines */
        fputs (buf, fp);    /* write lines  */
        n++;                /* update count */
    }
    if (fclose(fp) == EOF)
        perror ("fclose-stream error");

    return 0;
}
示例输出文件

$ cat jobs.txt
10 13 12
20 39 10
7 29 13
13 18 19
现在,除了简单地读取用户输入的每一行数据外,在写入文件之前验证每一行是否包含3个整数是明智的,如果不提供错误,则要求用户重新输入数据。它不需要更多的努力

    /* no changes above */
    ...
    fgets (buf, MAXC, stdin);   /* read and discard trailing '\n' */

    printf (" enter data for job[%2d]: ", n + 1);   /* prompt for data */
    while (fgets (buf, MAXC, stdin)) { /* read lines */
        int i1, i2, i3;
        /* validate 3-integers provided */
        if (sscanf (buf, "%d %d %d", &i1, &i2, &i3) == 3) {
            fputs (buf, fp);    /* write lines  */
            n++;                /* update count */
        }
        else    /* otherwise, handle error */
            fputs ("  error: invalid input.\n", stderr);

        if (n < nlines) /* if lines remain to read, prompt */
            printf (" enter data for job[%2d]: ", n + 1);
        else    /* otherwise break the loop */
            break;
    }
    ...
    /* no changes below */

输出文件是相同的。

将每行输入读入字符缓冲区,然后将缓冲区写入文件。无需作为整数读取,只需使用fgets或POSIX
getline
读取行,然后将其写回文件(面向行的函数都读取并在缓冲区中包含尾随的
'\n'
,这样就已经处理好了…),我认为您需要重新了解for循环的具体工作方式。你能解释一下(ptimes[0];ptimes[jobs];ptimes[jobs++])中每件事的目的吗?@Christiangibons C新手,我熟悉它们在python中的工作方式,所以我尝试做类似的事情。如果“jobs”是3,那么如果我是正确的,ptimes[jobs]应该为[0-3]创建ptimes值。所以对于for循环,我希望它从ptimes[0]运行到最后一个值,即ptimes[jobs]。for循环没有任何意义。初始值设定项部分只是计算未定义的数组项,然后丢弃它,因此它没有任何用途。exit test将超出数组边界的索引指向一个不仅未定义而且位于数组外部的值。这是真是假是不可预测的。增量是将
作业
增加到数组边界之外,然后将其用作数组边界之外的索引(同样是未定义的行为),然后丢弃结果。在C中,for循环的工作方式是第一部分是初始化,第二部分是条件,第三部分是每次迭代结束时所做的事情(通常是增量或类似的事情)。例如,
for(int i=0;i<5;++i)
将是一个for循环,它以初始化为零的
i
开始时迭代五次,只要
i
小于5,它就会保持循环。随着每次迭代增加
i
,当
i
等于0到4时,它将循环5次。
    /* no changes above */
    ...
    fgets (buf, MAXC, stdin);   /* read and discard trailing '\n' */

    printf (" enter data for job[%2d]: ", n + 1);   /* prompt for data */
    while (fgets (buf, MAXC, stdin)) { /* read lines */
        int i1, i2, i3;
        /* validate 3-integers provided */
        if (sscanf (buf, "%d %d %d", &i1, &i2, &i3) == 3) {
            fputs (buf, fp);    /* write lines  */
            n++;                /* update count */
        }
        else    /* otherwise, handle error */
            fputs ("  error: invalid input.\n", stderr);

        if (n < nlines) /* if lines remain to read, prompt */
            printf (" enter data for job[%2d]: ", n + 1);
        else    /* otherwise break the loop */
            break;
    }
    ...
    /* no changes below */
$ ./bin/fgets_fputs
How many Jobs? 4
 enter data for job[ 1]: 10 13 12
 enter data for job[ 2]: 20 39
  error: invalid input.
 enter data for job[ 2]: 20 39 10
 enter data for job[ 3]: 7 29 13
 enter data for job[ 4]: 13 18 xjf;slfj (cat steps on keyboard)
  error: invalid input.
 enter data for job[ 4]: 13 18 19