如何实现 .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", ¢er)) != 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;
}
我编写了一个程序来读取用户输入的文本文件,文件中包含格式化功能,例如 .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", ¢er)) != 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;
}