我编写了一个程序,可以读取用户输入的文本文件,并且该文件内部包含诸如.br.sp.nf之类的格式设置功能。

.nf表示没有填充,也意味着当您在.nf之后看到任何格式设置功能时,都应将其全部忽略,并且仅以其最初出现在文本文件中的格式输出文本。

例如:

.nf Hello my name is .br Jay.


输出:

Hello my name is Jay


如果不存在.nf,则输出为:

Hello my name is
Jay.


这是我的代码:

int main(void) {
    FILE *fp = NULL;
    char file_name[257] = {'\0'};
    char line[61] = {'\0'};
    char word[61] = {'\0'};
    int out = 0;
    int blanks;
    int space;
    int useFormats = 1;

    printf ( "Enter file name:\n");
    scanf ( " %256[^\n]", file_name);

    if ( ( fp = fopen ( file_name, "r")) == NULL) {
        printf ( "could not open file\n");
        return 1;
    }
    while (useFormats == 1){
        while ( ( fscanf ( fp, "%60s", word)) == 1) { //breaks the sentence    after .br
            if ( strcmp ( word, ".br") == 0) {
                printf ( "%s\n", line);
                line[0] = '\0';
                out = 1;
            }

            if ( strcmp ( word, ".nf") == 0) {// stop filling lines (no fill)
                useFormats == 0;
                line[0] = '\0';
                out = 1;

            }

            if ( strncmp ( word, ".sp", 3) == 0) { // creates n amount of spaces after .sp
                if ( ( sscanf ( &word[3], "%d", &blanks)) == 1) {
                    printf ( "%s\n", line);
                    while ( blanks) {
                        blanks--;
                        printf ( "\n");
                    }
                    line[0] = '\0';
                    out = 1;
                }
                else {
                    printf ( "%s\n", line);
                    line[0] = '\0';
                    out = 1;
                }
            }
            else if ( strlen ( line) + strlen ( word) + 1 < 60) {
                strcat ( line, " ");
                strcat ( line, word);
                out = 0;
            }
            else {
                printf ( "%s\n", line);
                strcpy ( line, word);
                out = 1;
            }
        }
        if ( !out) {
            printf ( "%s\n", line);
        }

        fclose ( fp);
        return 0;
    }
}


我尝试创建一个名为useFormats的变量,该变量在运行时为true,在达到.nf功能时将其设置为false,但是什么也没有发生。我不确定是否应该删除if语句并创建另一个while循环以说while (useFormats == 0)来实现.nf功能。

最佳答案

这应该捕获".nf"令牌并将useFormats设置为零。将if ( useFormats == 1) {添加到其他格式条件应禁用它们。

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

#define WIDTH 80

int main(void) {
    FILE *fp = NULL;
    char file_name[257] = {'\0'};
    char line[61] = {'\0'};
    char word[61] = {'\0'};
    int out = 0;
    int blanks = 0;
    int center = 0;
    int useFormats = 1;
    int margin = 0;

    printf ( "Enter file name:\n");
    scanf ( " %256[^\n]", file_name);

    if ( ( fp = fopen ( file_name, "r")) == NULL) {
        printf ( "could not open file\n");
        return 1;
    }

    while ( ( fscanf ( fp, "%60s", word)) == 1) {// read file to end one word at a time
        if ( strcmp ( word, ".nf") == 0) {// no formatting)
            useFormats = 0;
            center = 0;
            continue;
        }
        if ( strncmp ( word, ".ce", 3) == 0) {
            if ( useFormats == 1) {
                if ( ( sscanf ( &word[3], "%d", &center)) != 1) {
                    center = 0;
                }
            }
            continue;
        }
        if ( strncmp ( word, ".sp", 3) == 0) {
            if ( useFormats == 1) {
                if ( ( sscanf ( &word[3], "%d", &blanks)) == 1) {
                    margin = 0;
                    if ( center) {
                        margin = WIDTH - ( ( WIDTH - strlen ( line)) / 2);
                        center--;
                    }
                    printf ( "%*s\n", margin, line);
                    while ( blanks) {
                        blanks--;
                        printf ( "\n");
                    }
                    line[0] = '\0';
                    out = 1;
                }
                else {
                    margin = 0;
                    if ( center) {
                        margin = WIDTH - ( ( WIDTH - strlen ( line)) / 2);
                        center--;
                    }
                    printf ( "%*s\n", margin, line);
                    line[0] = '\0';
                    out = 1;
                }
            }
            continue;
        }
        if ( strcmp ( word, ".br") == 0) {
            if ( useFormats == 1) {
                margin = 0;
                if ( center) {
                    margin = WIDTH - ( ( WIDTH - strlen ( line)) / 2);
                    center--;
                }
                printf ( "%*s\n", margin, line);
                line[0] = '\0';
                out = 1;
            }
            continue;
        }
        if ( strlen ( line) + strlen ( word) + 1 <= 60) {
            strcat ( line, " ");
            strcat ( line, word);
            out = 0;
        }
        else {
            margin = 0;
            if ( center) {
                margin = WIDTH - ( ( WIDTH - strlen ( line)) / 2);
                center--;
            }
            printf ( "%*s\n", margin, line);
            strcpy ( line, word);
            out = 1;
        }
    }
    if ( !out) {
        margin = 0;
        if ( center) {
            margin = ( WIDTH - strlen ( line)) / 2;
            center--;
        }
        printf ( "%*s\n", margin, line);
    }

    fclose ( fp);
    return 0;
}

关于c - 如何实现`.nf`格式化功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33649520/

10-11 20:48