我创建了一个程序,用于读取用户输入的文件和
文件中的包含格式化功能,例如.br
和.spX
,其中X是整数。
所以我试图在输出中实现这些格式化功能。
当我看到“.br”但现在
时,我已经让我的程序打破了句子我试图在看到“.sp”和“.sp2”时创建1个空行
打印两条空白行,然后继续阅读文本。
while ( ( fscanf ( fp, "%60s", word)) == 1) {
if ( strcmp ( word, ".br") == 0) { // break the text when you see .br
printf ( "%s\n", line);
line[0] = '\0';
out = 1;
}
if ( strcmp ( word, ".spn") == 0) { // insert n blank lines
}
所以例如“Hello我的名字是.sp2 Josh”应输出:
Hello my name is
Josh
答案 0 :(得分:3)
如果.sp
和整数之间没有空格,如.sp4
,则可以使用strncmp比较前三个字符,然后使用sscanf来捕获整数。
if ( strncmp ( word, ".sp", 3) == 0) {
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;
}
}
答案 1 :(得分:1)
您可以利用以下事实:当转换失败时,需要进行数字转换的fscanf
格式不会提升文件指针。
因此,如果您遇到字符串".sp"
,请扫描下一个字符串以查找数字。如果失败,您将拥有默认大小写,一个空白行。否则,您有要打印的空格数。
例如:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *fp = fopen("josh.txt", "r");
char word[61];
int wc = 0;
if (fp == NULL) {
fprintf(stderr, "Could not open 'josh.txt'.\n");
exit(1);
}
while (fscanf(fp, "%60s", word) == 1) {
if (strcmp (word, ".br") == 0) {
putchar('\n');
wc = 0;
continue;
}
if (strcmp (word, ".sp") == 0) {
int n;
if (fscanf(fp, "%d", &n) < 1 || n < 0) n = 1;
putchar('\n');
while (n-- > 0) putchar('\n');
wc = 0;
continue;
}
if (wc++ > 0) putchar(' ');
printf("%s", word);
}
putchar('\n');
fclose(fp);
return 0;
}