将字符串与文件中的另一个字符串进行比较

时间:2014-11-18 20:41:55

标签: c

我想知道如何将字符串数组与文件中的字符串进行比较。

这里的借口是,我有一个单词数组,我想将它们与我创建的文本文件进行比较,以确保字符串数组与文件中的字符串不匹配。

我不知道如何处理这个问题,我建议我使用fscanf(...),fgets(...)或fgetc(...),但我不太清楚如何他们工作。你能解释一下如何阅读文本文件中的字符串吗?

我假设要比较它们我使用strcmp?如果我错了,请纠正我。

以下是我所得到的以及我写的内容是否不可理解或者您需要更多信息的问题。

int validName(const char name[ ]);


#include <stdio.h>     /* DO NOT MODIFY ANY PART OF THIS CODE EXCEPT
                          the function int validName(const char name[ ]) */
#include <stdlib.h>
#include <string.h>

#define ROWS 20
int validName(const char name[ ]);


int main( ) {
   char identifiers[ROWS][13] = { /* an array of strings */
      "isValid",    "if",    "floats",  "array",      "char",
      "take_break", "name*", "8values", "break_time", "structure",
      "register",   "for ",  " do",     "ok_to_go",   "_isThisValid",
      "goto",       "const", "void",    "continue",   "taxed2much" };

   int i, result,
       valid[ROWS] = {1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1 };
   for(i=0; i<ROWS; i++) {
      result = validName(identifiers[i]);
      printf("identifier: %-15s  your return: (%-6s)  name should be: %-9s you say: %s\n",
              identifiers[i], result ? "TRUE" : "FALSE" , valid[i] ? "VALID" : "INVALID",
              result ? "VALID" : "INVALID");
   }
   return 0;
}

int validName(const char name[ ]) {
        FILE *compareFile;
        compareFile = fopen("keywords.txt", "r");
        if(compareFile == NULL){
                printf("error opening file… \n");
                exit(EXIT_FAILURE);
        } else{

        }

}


/* Recall: An identifier is valid if it contains ONLY letters, digits and underscore
characters in any order. Also, the first character may not be a digit AND the name of the
identifier *MAY NOT* be a keyword. For this LAB keywords are stored as records in a text
file named keywords.txt. Each record contains a single keyword followed by the
newline. You may assume the file will be in the program's current working directory.
You can read data from a file by using the fscanf(...), fgets(...), or fgetc(...)
functions. */

2 个答案:

答案 0 :(得分:1)

这取决于你正在寻找的字符串。如果它们只是单词,它会变得容易多了。

无论如何,首先我会将整个文件读入一个带有fgetc()的缓冲区,之后继续使用strtok()以空格作为分隔符。

然后对每个令牌使用令牌上的strcmp()和你拥有的双列字符。 这可能需要一些技巧,例如剥离换行符和那种东西。最容易做到的就是不要将它们写入缓冲区并跳到下一个字符。

如果它们不是单词,则必须找到所需字符串的最大长度。 然后定义该长度的区域并逐字节地检查整个缓冲区。

如果您有更多信息,我可以举个例子

答案 1 :(得分:0)

你没有明确地说,但是你提到的库调用,我将假设你是用C语言编写的。蛮力的方法是将文件中的每个单词与数组中的每个单词进行比较。

#include "stdio.h"
#define LIST_LENGTH 4
#define MAX_WORD_SIZE 26

char bad_words[LIST_LENGTH][MAX_WORD_SIZE] = {"read", "Kernighan", "and", "Ritchie"};

int check_word(char * word){
 // loop through array checking each word
 int ii=0;
 int return_code = 0;
 for (ii=0; ii<LIST_LENGTH; ++ii){
   if( 0 == strcmp(word,bad_words[ii])){
     return_code++;
   }
 return return_code;
}

main(){
  FILE *fp1;
  char a_word[120];
  int num_matched;
  int num_bad;

  fp1 = fopen("a_file","r");

  do {
    num_matched = fscanf(fp1,"%s",a_word); 
    if (num_bad=check_word(a_word)) {
       printf("%d bad words found",num_bad);
    }
   } while (num_matched > 0);              /* repeat until EOF           */

 fclose(fp1);
}