我需要一些帮助来完成我的代码程序需要从.c文件中找到所有ifs并对它们进行计数到目前为止,我能够找到所有后跟“(”的if字符串(因为if后面有一个“(”),但现在我担心可能会有以if结尾并后跟“(”的东西,它也会被计算在内(一个不同的函数或类似的东西)所以我想在“我”之前检查一下是否有什么东西,如果没有,我会数一数,但如果有某种性格,我不会数一数。所以我的问题是我的想法是好还是坏如果是好的怎么做如果不好我能怎么办?
这是我目前的代码:

#include <stdio.h>
int main(){
    FILE *file = fopen ("poohzad.c", "r");
    char *ch = NULL;
    int i=1;
    if (file != NULL){
        char line [256];
        while (fgets(line, sizeof line, file) != NULL){
            if (strstr(line, "if")){
                ch=strstr(line, "if");
                if(*(ch+2) == '(') printf("%s\n", line);
            }
            i++;
        }

    }
    fclose (file);
    return 0;
}

最佳答案

大多数错误检查省略的地方使用它的风险由你自己承担(使用AStyle格式化,因此请不要对此发表评论)

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

int ifs;

/**
   loads an ascii file, returns NULL on failure
*/
char *loadFile(char*fname){
    char *buff;
    int len;
    FILE *fd;
    fd=fopen( fname,"r");
    if(!fd){
         printf("error opening file '%s'\n");
         exit(1);
    }
    fseek(fd,0,SEEK_END);
    len=ftell(fd);
    fseek(fd,0, SEEK_SET);
    buff=malloc(len+1);
    fread(buff,1,len,fd);
    fclose(fd);
    *(buff+len)=0;
    return buff;
}

/**
  placeholder what to do with the word
*/
void addWord(const char *word){

    if(0)
        printf("'%s'\n",word);
    else
    if(!strcmp(word,"if"))
        ifs++;
}


/**
    is operator simplified
*/
int isop(char c){
    static char list[]=
    "_"
    "abcdefghijklmnopqrstuvwxyz"
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    "0123456789";
    return !strchr(list,c);
}

int main(){
    char *pbuff,*buff,*ptr,c;
    int pos;
    pbuff=loadFile("main.c");
    buff=pbuff;
    ptr=pbuff;


    while(c=*buff){
        switch(c){
            case '?':
                if(0){
                    addWord("if");
                }
                ptr=&buff[1];
                break;
            case '#':
                while(*buff && *buff!='\n'){
                    if(c=='\\') buff++;
                    buff++;
                }
                ptr=&buff[1];
                break;
            case '/': //comment?

                //single line comment
                if(buff[1]=='/'){
                    buff+=2;
                    while(*buff && *buff!='\n'){
                        if(*buff=='\\')buff++;
                        buff++;
                    }

                    //multi line comment
                }else if(buff[1]=='*'){
                    buff+=2;
                    while(*buff && !((buff[-1]=='*') && (*buff=='/'))){
                        buff++;
                    }
                }else{
                    //not a comment, just ignore it;
                }
                ptr=&buff[1];
                break;
            case '\"': //skip strings
            case '\'':
                buff++;
                while(*buff && *buff!=c){
                    if(*buff=='\\') buff++;
                    buff++;
                }
                ptr=&buff[1];
                break;
            default:
                if(isspace(c) || isop(c)){
                    if(ptr-buff){
                        *buff=0;
                        addWord((const char*)ptr);
                        *buff=c;
                    }
                    ptr=&buff[1];
                }
        }
        buff++;

    }

    // take habit to free memory
    free(pbuff);
    printf("there are %d ifs in source file\n",ifs);
    return 0;
}

关于c - 如何计算.c文件中的ifs?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33746515/

10-13 23:15