Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在文件中查找单词无法正常工作_C_String_File - Fatal编程技术网

C 在文件中查找单词无法正常工作

C 在文件中查找单词无法正常工作,c,string,file,C,String,File,我正在用C编写一个函数,它读取文件并查找不在注释和字符串中的单词(例如printf(“Hello world”)我只需要printf,“Hello”和“world”不能被计算),但在某些文件中,我的程序还计算字符串中的单词 int isDelimiter(char *delim, char c){ int i = 0; while (delim[i]) { if (delim[i] == c) return 1; i++; } return 0

我正在用C编写一个函数,它读取文件并查找不在注释和字符串中的单词(例如printf(“Hello world”)我只需要printf,“Hello”和“world”不能被计算),但在某些文件中,我的程序还计算字符串中的单词

int isDelimiter(char *delim, char c){
  int i = 0;
  while (delim[i])
  {
    if (delim[i] == c)
        return 1;
    i++;
  }
  return 0;
}

int getIdentifiers(FILE *filePointer){

  char line[256], identifier[100];

  //char delimiters[] = "\n\[]();~`!=><|*/:&% \t\"{},-+#^$'&";
  char delimiters[] = {'\n', '\"', '[', ']', '(', ')', ';', '~', '`', 
    '!', '=', '<','>', '|', '*','/',':','&',
    '%','\t', '{', '}', ',','-','+','#','^','$','&','\0'};

  int cnt=0, inWord=0, isString=0, isSingleLineComment=0, 
     isMultiComment=0, isChar=0;

  rewind(filePointer);

  while(fgets(line, sizeof(line), filePointer)!=NULL){

    int i=0, j=0;

    isSingleLineComment=0;

    while(line[i]){

      //multi line comment check
      if(line[i]=='/' && line[i+1]=='*') isMultiComment=1;

      //single line comment
      if(line[i]=='/' && line[i+1]=='/') isSingleLineComment=1;

      //ending multi line comment
      if(line[i]=='*' && line[i+1]=='/' && isMultiComment==1) isMultiComment=0;

      //checking for string
      if(line[i]=='"' && isString==0) isString=1;

      //check if assignment char is in quote
      if(line[i]=='\'' && isChar==0) isChar =1;
      else if(line[i]=='\'' && isChar==1) isChar=0;

      //splitting textline into words
      if(inWord==0){
        if(!isDelimiter(delimiters, line[i])) {
          inWord = 1;
          identifier[j] = line[i];
          j++;
        } else {
          i++;
          continue;
        }
      } else {
        //ending word
        if(isDelimiter(delimiters, line[i])) {
          if(line[i]=='"' ) isString=1;

          inWord=0;
          identifier[j]= '\0';
          j=0;

          // identifier checking
          if(!isString && !isMultiComment && !isSingleLineComment && 
             !isChar &&
             !isdigit(identifier[0])){
             cnt++;
          }
        } else {
          identifier[j]= line[i];
          j++;
        }
      }

      if(line[i]=='"' && isString){
        isString=0;
      }
      i++;
    }
  }

  return cnt;
}
int-isDelimiter(char*delim,char-c){
int i=0;
while(delim[i])
{
if(delim[i]==c)
返回1;
i++;
}
返回0;
}
int getIdentifiers(文件*文件指针){
字符行[256],标识符[100];

//字符分隔符[]=“\n\[]();~`!=>在@MichaelOrgang的注释上展开,您需要处理与字符串有关的其他几种边缘情况。这两种情况都会导致当前解析器失败:

"This string \" contains a double quote"
"This one contains ' a single quote"
我强烈建议更改解析器的基本体系结构,使其从可以识别单词的状态开始,但是如果您看到
/*
/
中的任何一个,您将切换到(a)忽略单词的状态,以及(B)使用单独的循环使用输入,直到正确识别当前状态的有效终止,然后返回初始状态


因此,
/*
将继续读取文本,直到找到一个
*/
,而
/
只需丢弃当前行的剩余部分,然后重置。同样地,
向前扫描,直到找到第二个未替换的副本,忽略所有其他内容。在此模式下,您需要特别注意反斜杠,以便正确处理类似
“\”
“\\\”
“\\\”的内容
等等。

简单的问题-但是你为什么选择C来做这件事呢?更高级的语言使字符串操作更容易,而且通常有更好的内置库。我有一个大学项目,它必须是C语言,否则我会使用Java来完成这项任务。你问的问题并不简单。获得正确的注释块d处理奇怪的边缘情况,如:
//*
使这成为一项真正的调试任务。我清理了上面的粘贴,但现在,我将询问您在调试中花费了多少时间?遍历它应该会告诉您什么时候事情没有按预期工作。此外,您的“int…”行-您是否缺少双引号?否则,我会在您的需求中看到6个值。您可能希望在C正则表达式库中滚动,并避开所有这些混乱的解析。如果不小心,您将意外地编写自己的。更多建议-您试图一次完成所有操作,并造成了某种程度的火车失事。相反,首先,让一个单词计数器工作,然后让它使用分隔符,然后添加
/
检查,然后添加更多…直到你有了一个工作原型。这将帮助你保持所有的工作正常。当你一次做这一切时,你不知道任何bug实际存在的地方。还要注意,所有OP当前的特殊c常用大小写仅从字符串的第一个字符开始检查。。。