繁体   English   中英

访问下一个单词/字符串

[英]Access the next word/string

我有一个简单的基于C的代码来读取文件。 逐行读取输入。 标记行并打印当前标记。 我的问题是,如果满足某些条件,我想打印下一个标记。 你有任何想法怎么做。 对于这个项目,我真的需要您的帮助。 谢谢这是代码:

main(){

FILE *input;
FILE *output;
//char filename[100];

const char *filename = "sample1.txt";
input=fopen(filename,"r");
output=fopen("test.st","w");
char word[1000];
char *token;
int num =0;
char var[100];

fprintf(output,"LEXEME, TOKEN");
while( fgets(word, 1000, input) != NULL ){ //reads a line

token = strtok(word, " \t\n" ); // tokenize the line    
while(token!=NULL){ // while line is not equal to null
    fprintf(output,"\n");
    if (strcmp(token,"SIOL")==0)
        fprintf(output,"SIOL, SIOL", token);
    else if (strcmp(token,"DEFINE")==0)
        fprintf(output,"DEFINE, DEFINE", token);
    else if (strcmp(token,"INTEGER")==0){
        fprintf(output,"INTEGER, INTEGER");
        strcpy(var,token+1);
        fprintf(output,"\n%s,Ident",var);
    }
    else{
        printf("%s\n", token);
    }       
    token = strtok(NULL, " \t\n" ); //tokenize the word     
}}fclose(output);return 0;}

使用strtok函数很容易实现。 请注意,如果将空指针作为第一个参数,则该函数将继续扫描相同的字符串,该字符串将结束对函数的先前成功调用。 因此,如果您需要下一个令牌,只需致电

char* token = strtok(NULL, delimeters);

参见下面的小例子

#include  <stdio.h>
#include  <string.h>

int main(void)
{
    char str[] = "The quick brown fox";

    // split str by space
    char* token = strtok(str, " ");

    // if a token is found
    if(token != NULL) {
        // print current token
        printf("%s\n", token);
        // if token is "The"
        if(strcmp(token, "The") == 0) {
            // print next token
            printf("%s\n", strtok(NULL, " "));
        }
    }
    return 0;
}

输出将是

The
quick

继续我的评论。 我不确定我是否完全理解您的需求,但是如果您有以下字符串:

"The quick brown fox";

而且,仅当满足与当前单词有关的条件时,才想对字符串进行标记,打印下一个单词,然后才需要稍微调整一下思路。 在您的示例中,仅当当前单词为"The" ,您才想打印下一个单词"quick" "The"

思想上的调整就是您如何看待测试。 您不必保存当前单词符合某个条件的情况打印下一个单词,而是需要保存最后一个单词,而仅当最后一个单词符合某些条件时才打印当前单词-在示例中为"The"

要处理这种情况,可以使用至少47字符的静态声明的字符数组(Merriam-Websters未删节词典中最长的单词是46个字符)。 在下面的示例中,我将使用48 您可能会想只保存指向最后一个单词的指针,但是当使用strtok ,不能保证保留前一次迭代返回的内存地址-因此,请复制该单词。

将各个部分放在一起,您可以执行以下操作。 它将先前的令牌保存在last ,然后将当前单词与last进行比较,如果last == "The" ,则输出当前单词:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXW 48

int main (void) {

    char str[] = "The quick brown fox";
    char last[MAXW] = {0};
    char *p;

    for (p = strtok (str, " "); p; p = strtok (NULL, " ")) 
    {
        if (*last && strcmp (last, "The") == 0)
            printf (" '%s'\n", p);
        strncpy (last, p, MAXW);
    }

    return 0;
}

输出量

$ ./bin/str_chk_last
 'quick'

如果您有任何疑问,请告诉我。


测试说明

如评论中所述, *last只是last[0]简写。 因此,测试的第一部分*last只是测试if ((last[0] != 0) && ..由于last最初是被声明和初始化的:

char last[MAXW] = {0};

第一次通过循环时, last字符为0 通过包含检查last[0] != 0 ,这只会导致第一次执行for循环时跳过printf 测试的简写如下:

    if ((last[0] != 0) && strcmp (last, "The") == 0)
        printf (" '%s'\n", p);

伪代码只是说:

    if (NOT first iteration && last == "The")
        printf (" '%s'\n", p);

让我知道这是否没有道理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM