如何实现 .nf 格式化功能

How to implement `.nf` formatting feature

我编写了一个程序来读取用户输入的文本文件,文件中包含格式化功能,例如 .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] = {'[=13=]'};
    char line[61] = {'[=13=]'};
    char word[61] = {'[=13=]'};
    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] = '[=13=]';
                out = 1;
            }

            if ( strcmp ( word, ".nf") == 0) {// stop filling lines (no fill)
                useFormats == 0;
                line[0] = '[=13=]';
                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] = '[=13=]';
                    out = 1;
                } 
                else {
                    printf ( "%s\n", line);
                    line[0] = '[=13=]';
                    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 的变量,它在 运行 时为真,当它到达 .nf 特征时我将其设为假,但没有任何反应。我不确定是否应该删除 if 语句并创建另一个 while 循环来表示 while (useFormats == 0) 以实现 .nf 功能。

只要这样:while ( ( fscanf ( fp, "%60s", word)) == 1) 的计算结果为真,它就永远不会从 while 当前内部 while 循环中断。满足条件后,您可以使用 break; 跳出内部 while 循环。然后它将检查条件并跳出主 while 循环。您也不要使用 == 赋值。该操作数用于求值。

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

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

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

#define WIDTH 80

int main(void) {
    FILE *fp = NULL;
    char file_name[257] = {'[=10=]'};
    char line[61] = {'[=10=]'};
    char word[61] = {'[=10=]'};
    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] = '[=10=]';
                    out = 1;
                }
                else {
                    margin = 0;
                    if ( center) {
                        margin = WIDTH - ( ( WIDTH - strlen ( line)) / 2);
                        center--;
                    }
                    printf ( "%*s\n", margin, line);
                    line[0] = '[=10=]';
                    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] = '[=10=]';
                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;
}