我正在编写一个程序,该程序逐行读取文件以分隔单词和翻译。下面的代码有效。但是,我无法理解/* separate word and translation */
函数的load_dictionary
部分实际上是如何工作的。 。
不清楚的地方:
p line
的输出p word
之后的{li}输出。 word = line + strspn(line, DELIMS)
不应读到strspn
\ t并打印- ants \ t 。
文件:dict.txt
DELIMS
功能:主要
WORD TRANSLATION
ants anttt
anti eti
ante soggy
anda eggs
功能: load_dictionary :-读取字典文件
/* maximum number of characters for word to search */
#define WORD_MAX 256
/* maximum number of characters in line */
#ifndef LINE_MAX
#define LINE_MAX 2048
#endif
int main(int argc, char * argv[]) {
char word[WORD_MAX], * translation;
int len;
if (argc <= 1)
return 0; /* no dictionary specified */
/* load dictionary */
load_dictionary(argv[1]);
return 0;
}
答案 0 :(得分:2)
strspn
将给出DELIM
strcspn
将给出DELIM
(请参阅http://man7.org/linux/man-pages/man3/strspn.3.html)
因此,代码的想法是使用简单的指针算法使word
和translation
指针指向输入中的第一个单词和输入中的第二个单词。此外,该代码在第一个单词之后添加了一个NUL终止符,以使其看起来像两个字符串。
示例:
line: \t\t\t\tC++\0\t\t\tA programming language
^ ^ ^
| | |
| | translation points here
| |
| NUL added here
|
word points here
因此打印word
和translation
会得到:
C++
A programming language
带有附加注释的代码:
word = line + strspn(line, DELIMS); // Skip tabs, i.e.
// make word point to the
// first character which is
// not a tab (aka \t)
if ( !word[0] )
continue; /* no word in line */
translation = word + strcspn(word, DELIMS); // Make translation point to the
// first character after word
// which is a tab (aka \t), i.e. it
// points to the character just after
// the first word in line
*translation++ = '\0'; // Add the NUL termination and
// increment translation
translation += strspn(translation, DELIMS); // Skip tabs, i.e.
// make translation point to the
// second word in line which is
答案 1 :(得分:0)
我认为您可能需要发布更多代码以明确正在发生的事情,但是从您发布的内容来看,我建议您...
\t
-从文件中可以看到\t
单词和翻译。
因此strcspn
将字符数返回到下一个\t
字符,然后将指针移动该字符数-看起来单词和翻译之间的\t
字符已被替换由\0
字符组成。 将文件逐行读取到数组char line[...
。因此指针line
指向数组line[...
的开头。