了解strspn(const char * s,const char * accept)函数

时间:2019-09-03 08:30:52

标签: c pointers

我正在编写一个程序,该程序逐行读取文件以分隔单词和翻译。下面的代码有效。但是,我无法理解/* separate word and translation */函数的load_dictionary部分实际上是如何工作的。 I ran it through **gdb**

不清楚的地方

  • 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;
  }

2 个答案:

答案 0 :(得分:2)

strspn将给出DELIM

中存在的初始字符数

strcspn将给出DELIM

不存在的初始字符数

(请参阅http://man7.org/linux/man-pages/man3/strspn.3.html

因此,代码的想法是使用简单的指针算法使wordtranslation指针指向输入中的第一个单词和输入中的第二个单词。此外,该代码在第一个单词之后添加了一个NUL终止符,以使其看起来像两个字符串。

示例:

line: \t\t\t\tC++\0\t\t\tA programming language
              ^   ^      ^
              |   |      |
              |   |      translation points here
              |   |      
              |   NUL added here
              |  
              word points here

因此打印wordtranslation会得到:

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)

我认为您可能需要发布更多代码以明确正在发生的事情,但是从您发布的内容来看,我建议您...

  • 看看https://www.geeksforgeeks.org/strcspn-in-c/的目的是将行拆分成单个单词-似乎单词之间期望使用\t-从文件中可以看到\t单词和翻译。 因此strcspn将字符数返回到下一个\t字符,然后将指针移动该字符数-看起来单词和翻译之间的\t字符已被替换由\0字符组成。

将文件逐行读取到数组char line[...。因此指针line指向数组line[...的开头。