我正在尝试使用 C 程序对文本进行简单的解析。我编写的函数应该检查保存有一行文本的缓冲区,并查看该行是否包含 BOL 处的特定单词。
输入参数是:
size
:sizeof(word),在调用函数之前计算。buf
:包含正在解析的文本中的一行的缓冲区。word
:函数在 BOL 中查找的单词。
代码如下:
#include <stdio.h>
#include <string.h>
int strchk(int size, const char buf[1024], char *word) {
char a[size];
int i;
for (i = 0; i < size - 1; i++) {
a[i] = buf[i];
}
if (strcmp(a, word) == 0)
return 1;
else
return 0;
}
问题是由于某种原因,某个单词无法被识别。之前的单词已被相同的函数正确识别。下面是调用该函数的两个上下文,第一个会导致正确的识别,第二个则不会,而文本在文本内不同行的开头包含这两个单词。
char c[] = "|conventional_long_name";
if (strchk(sizeof(c), buf, c)) {
fputs(" conventional_long_name: \"", stdout);
getdata(buf, c, sizeof(c));
}
char d[] = "|official_languages";
if (strchk(sizeof(d), buf, d)) {
fputs(" religion: \"", stdout);
getdata(buf, d, sizeof(d));
}
当我首先在 strchk()
函数中检查字符串 a 的大小时,它给出的大小为 20,但是如果我让它打印出字符串,它会告诉我它实际上是 |official_languagesfici
。当您计算字符数时,它与前面提到的 |conventional_long_name
一样长,这表明该函数调用中的某些参数在下一个函数调用中起作用,我只是无法弄清楚我在哪里犯了错误。任何帮助将不胜感激。
最佳答案
您需要在函数strchk
中设置a
数组的空终止符。
使用它来实现
a[size - 1] = '\0';
在for
循环之后。
注释:
- 由于您没有修改函数
strchk
中的字符串word
,因此声明参数const
。const
-correctness is important!
关于C 文本解析器无法识别单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107503/