句子中单词倒序的问题

时间:2019-03-26 21:57:17

标签: c

我想逐行阅读inputtext.txt并反转每一行中的单词顺序并将其打印出来(输入:hello world,输出:world hello)。有了这段代码,我的输出全部混乱了,我收到了运行时错误2,指出数组“字符串”周围的堆栈已损坏。我尝试在每次while循环迭代之后将字符串重置为null,但仍然遇到相同的错误。是否有人建议消除运行时错误或帮助代码更平稳地运行?

int main() {
    FILE *inp,*outp;        //file input and output
    int i,wordcount;                    //define counter variables
    int k = 0,j=0;
    char string[200];       //define string to scan sentence into
    char words[20][20];     //2D string for each word in the sentence
    inp = fopen("inputtext.txt", "r");
    outp = fopen("output.txt", "w");
    if (inp == NULL) {
        printf("File not found.\n");
    }
    else {
        while (!feof(inp)) {

            fgets(string, 1000, inp);
            printf("GOT SENTENCE\n");
            for (i = 0; string[i] != '\0'; i++) {


                if (string[i] == ' ') {
                    words[k][j] = '\0';
                    k++;
                    j = 0;
                }
                else
                {
                    words[k][j] = string[i];
                    j++;
                }

            }

            words[k][j] = '\0';
            wordcount = k;
            for (i = wordcount; i >= 0; i--) {
                printf("%s ", words[i]);
            }
            printf("\n\n");

        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

以下建议的代码:

  1. 干净地编译
  2. 正确检查错误
  3. 正确地将错误消息输出到stderr
  4. 执行所需的功能
  5. 适当限制输入的最大长度
  6. 假设输入文件中的任何行都不能超过199个字符
  7. 最小化函数:strlen()被调用的次数
  8. 实际上将颠倒的句子写到输出文件中

现在,建议的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main() 
{
    FILE *inp,*outp;        //file input and output
    int wordcount;                    //define counter variables
    int k = 0;
    int j = 0;
    char string[200];       //define string to scan sentence into
    char words[20][20];     //2D string for each word in the sentence

    inp = fopen("inputtext.txt", "r");
    if( !inp )
    {
        perror( "fopen to read: inputtext.txt failed" );
        exit( EXIT_FAILURE );
    }

    outp = fopen("output.txt", "w");
    if( !outp )
    {
        perror( "fopen to write: output.txt failed" );
        // cleanup
        fclose( inp );
        exit( EXIT_FAILURE );
    }


    size_t strLength = strlen( string );

    for (size_t i = 0; i < strLength; i++)
    {
        // remove any trailing newline
        string[ strspn( string, "\n" ) ] = '\0';

        printf("GOT SENTENCE\n");

        for (size_t i = 0; i < strlen(string); i++) 
        {
            if (string[i] == ' ') 
            {
                words[k][j] = '\0';
                k++;
                j = 0;
            }

            else
            {
                words[k][j] = string[i];
                j++;
            }
        }

        words[k][j] = '\0';
        wordcount = k;

        for ( int i = wordcount; i >= 0; i--) 
        {
            printf("%s ", words[i]);
            fprintf( outp, "%s ", words[i] );
        }
        printf("\n\n");
        fprintf( outp, "\n" );
    }

    return 0;
}