所以我在文件中有一个文本墙,我需要识别$ sign之间的一些单词并将它们称为数字然后将修改后的文本打印在另一个文件中以及数字对应的内容。 此外,未定义线条,列数最多为80个字符。
前:
I $like$ cats.
I [1] cats.
[1] --> like
这就是我的所作所为:
#include <stdio.h>
#include <stdlib.h>
#define N 80
#define MAX 9999
int main()
{
FILE *fp;
int i=0,count=0;
char matr[MAX][N];
if((fp = fopen("text.txt","r")) == NULL){
printf("Error.");
exit(EXIT_FAILURE);
}
while((fscanf(fp,"%s",matr[i])) != EOF){
printf("%s ",matr[i]);
if(matr[i] == '\0')
printf("\n");
//I was thinking maybe to find two $ but Idk how to replace the entire word
/*
if(matr[i] == '$')
count++;
if(count == 2){
...code...
}
*/
i++;
}
fclose(fp);
return 0;
}
我的问题是fscanf无法识别'\0'
所以当我打印数组时它不会进入下一行...我也不知道如何替换{ {1}}带有数字。
答案 0 :(得分:1)
fscanf()
会识别&#39; \ 0&#39;但这不是问题所在。
代码需要检测'\n'
。 fscanf(fp,"%s"...
不会这样做。 "%s"
指向的第一件事是使用(而不是保存)包括'\n'
在内的任何前导空格。使用fgets()
阅读一行文字。
一次只读1行。然后沿着缓冲区向前走,寻找单词
使用"%n"
跟踪缓冲区扫描的停止时间。
// more room for \n \0
#define BUF_SIZE (N + 1 + 1)
char buffer[BUF_SIZE];
while (fgets(buffer, sizeof buffer, stdin) != NULL) {
char *p = buffer;
char word[sizeof buffer];
int n;
while (sscanf(p, "%s%n", word, &n) == 1) {
// do something with word
if (strcmp(word, "$zero$") == 0) fputs("0", stdout);
else if (strcmp(word, "$one$") == 0) fputs("1", stdout);
else fputs(word, stdout);
fputc(' ', stdout);
p += n;
}
fputc('\n', stdout);
}
答案 1 :(得分:1)
fscanf("%s")
不仅会一次读取一个以空格分隔的字符串,还会占用这些字符串之间的所有空格,包括行终止符。如果你想在输出中重现输入的空格,正如你的例子所暗示的那样,那么你需要一种不同的方法。
此外,未定义线条,列数最多为80个字符。
我认为这意味着行的数字事先是未知的,并且可以接受假设没有行将包含超过80个字符(不计算任何行终止符)。< / p>
当你说
时我的问题是fscanf无法识别&#39; \ 0&#39;因此,当我打印数组时,它不会进入下一行
我想你在谈论这段代码:
char matr[MAX][N]; /* ... */ if(matr[i] == '\0')
鉴于matr
的声明,无论其他任何考虑因素,给定条件总是评估为false
。 fscanf()
根本没有考虑因素。 matr[i]
的类型为char[N]
,类型为N
的{{1}}元素数组。这会求值为指向数组第一个元素的指针,该指针永远不会是char
。您似乎正在尝试确定何时编写换行符,但没有任何类似于此方法的内容可以做到这一点。
我建议你从@ Barmar的建议开始,逐行通过NULL
阅读。这可能是这样的:
fgets()
然后,对于您阅读的每一行,以您喜欢的任何方式解析char line[N+2]; /* N + 2 leaves space for both newline and string terminator */
if (fgets(line, sizeof(line), fp) != NULL) {
/* one line read; handle it ... */
} else {
/* handle end-of-file or I/O error */
}
令牌,并输出所需的结果(除了"$word$"
- 除了分隔的标记以外的所有内容;每个的括号替换编号令牌)。当然,您需要记录替换令牌以便以后输出。请记住制作副本,因为缓冲区将在每次读取时被覆盖(如果按照我的建议完成)。
答案 2 :(得分:0)
使用fread()将文件内容读取到char []缓冲区。然后遍历这个缓冲区,每当你找到一个$时,你执行一个strncmp来检测用哪个值替换它(请记住,在单词的末尾有一个第二个$)。要用一个数字替换$ word $,你需要缩小或扩展单词位置的缓冲区 - 这取决于ascii格式的数字的字符串大小(在google上查看解决方案,通常你应该可以使用的memmove)。然后你可以将数字写入洞穴,这是通过扩展缓冲区(只是覆盖$ word $)而产生的。 然后将缓冲区写入文件,覆盖其以前的所有内容。