C 在文件中查找单词无法正常工作
我正在用C编写一个函数,它读取文件并查找不在注释和字符串中的单词(例如printf(“Hello world”)我只需要printf,“Hello”和“world”不能被计算),但在某些文件中,我的程序还计算字符串中的单词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
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常用大小写仅从字符串的第一个字符开始检查。。。