C fgets的阅读时间太晚了

C fgets的阅读时间太晚了,c,fgets,C,Fgets,好的。在完全重写了这个程序,支持fgets之后,它主要读取单词 这分为两部分,在gcc linux机器上编译。但是,这需要一个重定向语句 因此,一旦编译,它必须按如下方式运行: ./a.out < data1 以下是程序本身: #include <stdio.h> #include <stdlib.h> #include <string.h> #define ROWS 50 #define COLUMNS 50 #define TR 100 #defi

好的。在完全重写了这个程序,支持fgets之后,它主要读取单词

这分为两部分,在gcc linux机器上编译。但是,这需要一个重定向语句

因此,一旦编译,它必须按如下方式运行:

./a.out < data1
以下是程序本身:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROWS 50
#define COLUMNS 50
#define TR 100
#define TC 100

int main( )
{
    int s1 = 0, s2 = 0;
    int sizeOfGrid = 0;
    int wordCount = 0;
    int rowNumber = 0;
    int colNumber = 0;
    /* */
    char tempLetters[ROWS][COLUMNS];
    char letters[ROWS][COLUMNS];
    char words[ROWS][COLUMNS];
    char wordTemp[50];
    char firstRow[100], nextRow[100];
    /* fgets(stdin); */
    char firstRowTemp[100], nextRowTemp[100];
    /* output       input */

    setbuf(stdout, NULL);

    for (s2 = 0; s2 < 100; s2++)
    {
        firstRowTemp[s2] = ' ';
        nextRowTemp[s2] = ' ';


        if (s2 < 50)
        {
            wordTemp[s2] = ' ';
            for (s1 = 0; s1 < 50; s1++)
            {
                words[s2][s1] = ' ';
            }
        }
    }

    /* Let's attempt to despace the first line, and then count the chars. */
    fgets(firstRow,100,stdin);
    s1 = 0;
    s2 = 0;
    for (colNumber = 0; colNumber < strlen(firstRow); colNumber++)
    {
        if ((firstRow[colNumber] != ' ') && (firstRow[colNumber] != '\n'))
        {
            firstRowTemp[s1] = firstRow[colNumber];
            letters[rowNumber][s2++] = firstRowTemp[s1++];
            sizeOfGrid++;
        }
    }

    /* We have now successfully gotten the size of the grid, so lets
     * put it to good use within our next loops to read in the rest
     * of the lines.
     * We take it in a for loop up to sizeOfGrid*2 because right now,
     * we still have spaces. Once we get rid of those, it'll be able to utilize
     * normal sizeOfGrid count.*/
    for (rowNumber = 1; rowNumber < sizeOfGrid*2; rowNumber++)
    {
        fgets(nextRow, 100, stdin);
        s1 = 0;
        s2 = 0;
        for (colNumber = 0; colNumber < sizeOfGrid*2; colNumber++)
        {
            if ((nextRow[colNumber] != ' ') && (tempLetters[rowNumber][colNumber] != '\n'))
            {
                nextRowTemp[s1] = nextRow[colNumber];
                letters[rowNumber][s2++] = nextRowTemp[s1++];
            }
        }
    }

    /* Next up, it's time to store the words. Scan the rest of the file for words
     * and store them as chars. */

    rowNumber = 0;
    colNumber = 0;

    while(fgets(wordTemp,50,stdin) != NULL)
    {
        for (s1 = 0; s1 < strlen(wordTemp); s1++)
        {
            if (wordTemp[s1] != '\n')
            {
                words[rowNumber][colNumber++] = wordTemp[s1];
            }

        }
        colNumber = 0;
        wordCount++;
        rowNumber++;
    }

    /* For testing purposes and making sure it receives the grid entirely.*/

    for (s2 = 0; s2 < sizeOfGrid; s2++)
    {
        printf("%c",firstRowTemp[s2]);
    }
    printf("\nSize of grid is %d\n",sizeOfGrid);
    printf("\n");
    for (rowNumber = 0; rowNumber < sizeOfGrid; rowNumber++)
    {
        for (colNumber = 0; colNumber < sizeOfGrid; colNumber++)
        {
            printf("%c", letters[rowNumber][colNumber]);
        }
        printf("\n");
    }

    for (rowNumber = 0; rowNumber < ROWS; rowNumber++)
    {
        for (colNumber = 0; colNumber < COLUMNS; colNumber++)
        {
            if ((words[rowNumber][colNumber] != ' ') && (words[rowNumber][colNumber] != '\n'))
                printf("%c", words[rowNumber][colNumber]);
            else
                break;
        }
        if (colNumber > 1)
            printf("\n");
    }

    /* End print debugging here.*/

    return 0;
}
#包括
#包括
#包括
#定义第50行
#定义第50列
#定义TR 100
#定义TC 100
int main()
{
int s1=0,s2=0;
int-sizeOfGrid=0;
int字数=0;
int rowNumber=0;
int colNumber=0;
/* */
字符模板[行][列];
字符字母[行][列];
字符字[行][列];
char-wordTemp[50];
char firstRow[100],nextRow[100];
/*fgets(stdin)*/
char firstRowTemp[100],nextRowTemp[100];
/*输出输入*/
setbuf(标准输出,空);
对于(s2=0;s2<100;s2++)
{
firstRowTemp[s2]='';
nextRowTemp[s2]='';
如果(s2<50)
{
wordTemp[s2]='';
对于(s1=0;s1<50;s1++)
{
字[s2][s1]='';
}
}
}
/*让我们试着把第一行打倒,然后数一数*/
fgets(第一排,100,标准);
s1=0;
s2=0;
for(colNumber=0;colNumber1)
printf(“\n”);
}
/*在这里结束打印调试*/
返回0;
}
现在我来回答我的问题


fgets似乎跳过了大量的单词,仅从诽谤开始,而不是从列表的顶部开始(本例中的修订)。哪里出了问题?

在您向我们展示的网格中,字母之间水平方向有空格,但字母行之间没有空行,因此您需要使用
sizeOfGrid*2
在列上循环,而不是在行上循环。

次要:建议而不是
fgets(firstRow,100,stdin),考虑<代码> fGET(FiSTROW,FILSTROW SIDEN,STDIN);代码>。它不容易出错,并且易于维护。(还有
fgets(nextRow,100,stdin);
)关于
sizeOfGrid*2
的评论似乎在确切地告诉你该做什么。没有空行,所以你读的是你应该读的两倍。此外,您拼写错误的构成可能在
中没有限制,而(fgets(wordTemp,50,stdin)
循环
rowNumber
words[rowNumber][colNumber++]
增长超过50?单词[][]不受限制,也不与sizeOfGrid结合使用。sizeOfGrid仅用于字母盒。单词完全放在其他地方。另一方面,“Construction”在拼图中的拼写也是如此。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROWS 50
#define COLUMNS 50
#define TR 100
#define TC 100

int main( )
{
    int s1 = 0, s2 = 0;
    int sizeOfGrid = 0;
    int wordCount = 0;
    int rowNumber = 0;
    int colNumber = 0;
    /* */
    char tempLetters[ROWS][COLUMNS];
    char letters[ROWS][COLUMNS];
    char words[ROWS][COLUMNS];
    char wordTemp[50];
    char firstRow[100], nextRow[100];
    /* fgets(stdin); */
    char firstRowTemp[100], nextRowTemp[100];
    /* output       input */

    setbuf(stdout, NULL);

    for (s2 = 0; s2 < 100; s2++)
    {
        firstRowTemp[s2] = ' ';
        nextRowTemp[s2] = ' ';


        if (s2 < 50)
        {
            wordTemp[s2] = ' ';
            for (s1 = 0; s1 < 50; s1++)
            {
                words[s2][s1] = ' ';
            }
        }
    }

    /* Let's attempt to despace the first line, and then count the chars. */
    fgets(firstRow,100,stdin);
    s1 = 0;
    s2 = 0;
    for (colNumber = 0; colNumber < strlen(firstRow); colNumber++)
    {
        if ((firstRow[colNumber] != ' ') && (firstRow[colNumber] != '\n'))
        {
            firstRowTemp[s1] = firstRow[colNumber];
            letters[rowNumber][s2++] = firstRowTemp[s1++];
            sizeOfGrid++;
        }
    }

    /* We have now successfully gotten the size of the grid, so lets
     * put it to good use within our next loops to read in the rest
     * of the lines.
     * We take it in a for loop up to sizeOfGrid*2 because right now,
     * we still have spaces. Once we get rid of those, it'll be able to utilize
     * normal sizeOfGrid count.*/
    for (rowNumber = 1; rowNumber < sizeOfGrid*2; rowNumber++)
    {
        fgets(nextRow, 100, stdin);
        s1 = 0;
        s2 = 0;
        for (colNumber = 0; colNumber < sizeOfGrid*2; colNumber++)
        {
            if ((nextRow[colNumber] != ' ') && (tempLetters[rowNumber][colNumber] != '\n'))
            {
                nextRowTemp[s1] = nextRow[colNumber];
                letters[rowNumber][s2++] = nextRowTemp[s1++];
            }
        }
    }

    /* Next up, it's time to store the words. Scan the rest of the file for words
     * and store them as chars. */

    rowNumber = 0;
    colNumber = 0;

    while(fgets(wordTemp,50,stdin) != NULL)
    {
        for (s1 = 0; s1 < strlen(wordTemp); s1++)
        {
            if (wordTemp[s1] != '\n')
            {
                words[rowNumber][colNumber++] = wordTemp[s1];
            }

        }
        colNumber = 0;
        wordCount++;
        rowNumber++;
    }

    /* For testing purposes and making sure it receives the grid entirely.*/

    for (s2 = 0; s2 < sizeOfGrid; s2++)
    {
        printf("%c",firstRowTemp[s2]);
    }
    printf("\nSize of grid is %d\n",sizeOfGrid);
    printf("\n");
    for (rowNumber = 0; rowNumber < sizeOfGrid; rowNumber++)
    {
        for (colNumber = 0; colNumber < sizeOfGrid; colNumber++)
        {
            printf("%c", letters[rowNumber][colNumber]);
        }
        printf("\n");
    }

    for (rowNumber = 0; rowNumber < ROWS; rowNumber++)
    {
        for (colNumber = 0; colNumber < COLUMNS; colNumber++)
        {
            if ((words[rowNumber][colNumber] != ' ') && (words[rowNumber][colNumber] != '\n'))
                printf("%c", words[rowNumber][colNumber]);
            else
                break;
        }
        if (colNumber > 1)
            printf("\n");
    }

    /* End print debugging here.*/

    return 0;
}