如何从 C 文件中打印部分标记化字符串

How to print part of a tokenized string from a file in C

我在处理作为文件中一行的标记化字符串时遇到了一些问题。我想从找到令牌的地方打印行,但我似乎找不到解决方法。请忽略文件部分的输出以及作者,class 和方法 if 语句,因为我已将它们整理出来。

例如,我希望它从这一行打印: @return the matric 只有这部分:the matric

代码:

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

int main (int argc, char **argv)
{
    char line [1000];
    char *delimeters = ".,; \t\n";
    int total_lines = 0;
    int total_comments = 0;
    int nonblank_lines = 0;

    FILE *input = fopen (argv[2], "r");
    FILE *output = fopen (argv[4],"w");
    
    while(fgets(line,1000,input) != NULL)
    {
        char *word = strtok(line, delimeters);
        total_lines++;
        
        if(word != NULL)
        {
            nonblank_lines++;
        }
        
        if(word != NULL && strcmp(word,"/**") == 0)
        {
            total_comments++;
        }
        
        while(word != NULL)
        {
            if(word != NULL && strcmp(word,"@author") == 0)
            {
                char *author_name = strtok(NULL, delimeters);
                char *author_surname = strtok(NULL, delimeters);
                printf ("Author: %s %s\n", author_name, author_surname);
            }
        
            if(word != NULL && strcmp(word,"public") == 0)
            {
                char *jmp = strtok(NULL, delimeters);
                    
                if(jmp != NULL && strcmp(jmp,"class") == 0)
                {
                    char *class_name = strtok(NULL, delimeters);
                    printf ("Class %s\n", class_name);
                }else{
                    char *method_name = strtok(NULL, delimeters);
                    printf ("Method %s\n", method_name);
                }
            }
            
            if(word != NULL && strcmp(word,"@return") == 0)
            {
                printf("Enters IF 4\n");
                
                char *return_value = strtok(NULL, delimeters);
                
                printf ("Returns: %s\n", return_value;
            }
        
            /*if(word != NULL && strcmp(word,"@param") == 0)
            {   
                printf("Enters IF 5\n");
                char *parameters = strtok(NULL, delimeters);
                printf("Parameter: %s\n", parameters);
                
                //int param_found
                
            }*/
            word = strtok(NULL, delimeters);
        }
    }
    
    printf ("The total number of lines is %d\n", total_lines);
    printf ("The total number of  non-blank lines is %d\n", nonblank_lines);
    printf ("The total number of comments is %d\n", total_comments);
    
    fclose(input);
    fclose(output);
    return 0;
}

因此,根据我的评论,您需要为每个 if 语句添加类似此块的内容:

        while(fgets(line, 1000, input) != NULL)
        {
            char *first_word_in_line = strtok(line, delimeters);

            if(strcmp(first_word_in_line, "@return") == 0)
            {
                char *word = strtok(NULL, delimeters);
                printf ("Returns: ");
                while(word != NULL)
                {
                    printf ("%s ", word);
                    word = strtok(NULL, delimeters);
                }
                printf("\n");
            }
        }

请注意,我在 word 顶部添加了另一个变量 first_word_in_line - 这不是必须的,但它可以减少您编码时的混淆,并且它表明该行中的第一个单词具有不同的含义意思是因为这只是标题。

此外,您应该了解 strcmpstrncmp。通常使用 strncmp.

是个好习惯

我得到的答案是这样的:

if(word != NULL && strcmp(word,"@return") == 0)
        {
            char *return_value = strtok(NULL, delimeters);
            printf ("Returns: ");
                while(return_value != NULL)
                {
                    printf ("%s ", return_value);
                    return_value = strtok(NULL, delimeters);                
                }
            printf("\n");
        }

你开头的参数有点乱。

./program.c input.txt output.txt

argv[0] 将为您提供程序名称(在本例中为 program.c),argv[1] 您传递的第一个参数(input.txt)和 argv[2]第二个参数(output.txt)

还缺少一个括号,对于评论 /* comment */ c 中的一颗星就足够了。

修复它对我有用。 但请注意,如果您按照自己的方式使用 strtok() 剪切注释,则注释开头左右必须有一个分隔符。

somecode; /* This should be recognized */
somecode;/* This not */
somecode; /*This neither */

这里是更正后的代码:

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

int main (int argc, char **argv)
{
    char line [1000];
    char *delimeters = ".,; \t\n";
    int total_lines = 0;
    int total_comments = 0;
    int nonblank_lines = 0;

    FILE *input = fopen (argv[1], "r");
    FILE *output = fopen (argv[2],"w");
    
    while(fgets(line,1000,input) != NULL)
    {
        char *word = strtok(line, delimeters);
        total_lines++;
        
        if(word != NULL)
        {
            nonblank_lines++;
        }
        
        if(word != NULL && strcmp(word,"/*") == 0)
        {
            total_comments++;
        }
        
        while(word != NULL)
        {
            if(word != NULL && strcmp(word,"@author") == 0)
            {
                char *author_name = strtok(NULL, delimeters);
                char *author_surname = strtok(NULL, delimeters);
                printf ("Author: %s %s\n", author_name, author_surname);
            }
        
            if(word != NULL && strcmp(word,"public") == 0)
            {
                char *jmp = strtok(NULL, delimeters);
                    
                if(jmp != NULL && strcmp(jmp,"class") == 0)
                {
                    char *class_name = strtok(NULL, delimeters);
                    printf ("Class %s\n", class_name);
                }else{
                    char *method_name = strtok(NULL, delimeters);
                    printf ("Method %s\n", method_name);
                }
            }
            
            if(word != NULL && strcmp(word,"@return") == 0)
            {
                printf("Enters IF 4\n");
                
                char *return_value = strtok(NULL, delimeters);
                
                printf ("Returns: %s\n", return_value);
            }
        
            /*if(word != NULL && strcmp(word,"@param") == 0)
            {   
                printf("Enters IF 5\n");
                char *parameters = strtok(NULL, delimeters);
                printf("Parameter: %s\n", parameters);
                
                //int param_found
                
            }*/
            word = strtok(NULL, delimeters);
        }
    }
    
    printf ("The total number of lines is %d\n", total_lines);
    printf ("The total number of  non-blank lines is %d\n", nonblank_lines);
    printf ("The total number of comments is %d\n", total_comments);
    
    fclose(input);
    fclose(output);
    return 0;
}