사용자가 텍스트 파일의 단어 또는 단어 모음의 인스턴스 수를 찾을 수있게 해주는 프로그램을 작성했습니다. 사용자는 명령 행에서이 같은 뭔가를 입력 할 수 있습니다왜 두 단어 계산 방법이 크게 다른가요?
$ ./wordCount Mars TripToMars.txt
단어 "화성"의 인스턴스의 수를 검색하기 위해 화성 책 여행에서, 또는
$ ./wordCount -f collectionOfSearchWords.txt TripToMars.txt
를 검색 할 수 collectionOfSearchWords.txt의 개별 행에있는 여러 단어의 인스턴스 수입니다. 용어를 포함하는 것이다,
$ grep -o 'Mars' TripToMars.txt | wc -w
및
$ grep -o -w 'Mars' TripToMars.txt | wc -w
첫 번째 명령은 아무 곳이나 단어의 인스턴스의 수를 찾습니다
프로그램이 정확하다고 보장하기 위해, 나는은 grep 명령을 사용 "Mars", "Marses"등의 구두점을 포함하는 독립 실행 형 단어로 "화성"의 인스턴스 만 찾으면 서 "Marsa", "Marseen", "Marses" 화성? "등.grep 명령은 모두 책에서 "화성"의 인스턴스 수를 49로 반환합니다.
while 루프에서 코드를 사용할 때 (간단히 말하면 관련 코드 만 포함) 프로그램에서 49를 반환합니다. 굉장합니다!
FILE *textToSearch;
char *readMode = "r";
int count;
char nextWord[100];
char d;
textToSearch = fopen(argVector[argCount-1], readMode);
if (textToSearch == NULL) {
fprintf(stderr, "Cannot open %s to be searched\n", argVector[argCount-1]);
return 1;
} else {
while (fscanf(textToSearch, "%*[^a-zA-Z]"), fscanf(textToSearch, "%80[a-zA-Z]", nextWord) > 0) {
// increment the counter if the word is a match
if (strcmp(nextWord, argVector[word]) == 0) {
count++;
}
}
}
하지만 이전이 while 루프를 대체 할 때, 프로그램은
while (fscanf(textToSearch, "%*[^a-zA-Z]"), fscanf(textToSearch, "%80[a-zA-Z]", nextWord) > 0) {}
및
while(1) {
d = fscanf(textToSearch, "%s", nextWord);
if (d == EOF) break;
}
사이의 큰 차이는 무엇 그래서 17
while(1) {
d = fscanf(textToSearch, "%s", nextWord);
if (d == EOF) break;
// increment the counter if the word is a match
if (strcmp(nextWord, argVector[word]) == 0) {
count++;
}
}
반환
?
편집는 화성 시도 및 계정 구두점을 후행 경우를위한 17 생산 코드에
if (strcmp(nextWordDict, nextWord) == 0 ||
strcmp(nextWordDict, strcat(nextWord, ".")) == 0 ||
strcmp(nextWordDict, strcat(nextWord, "?")) == 0 ||
strcmp(nextWordDict, strcat(nextWord, "!")) == 0 ||
strcmp(nextWordDict, strcat(nextWord, ",")) == 0) {
count++;
}
, 그리고 변화가 없었다 :
는이 코드를 추가했습니다. 아직 17EDIT2 :
존 볼린저으로가 제대로 아래 지적 nextWord에 버퍼링 된 문자열이 이미 후행 문장이 때문에이 코드는 아무것도 실시하지 않습니다, 그리고 코드는 더 추가 될 것이다. 이것은 내 생각에 잘못된 생각이다.
Dunno,하지만 쉽게 알 수 있습니다. 단지'fscanf' 이후에'printf ("% s \ n", 다음 단어)'. 출력을 두 파일로 리디렉션하고 파일을 비교하십시오. – user3386109
또한 작업 코드에서이 형식 문자열' "* * [^ a-zA-Z] % 80 [a-zA-Z]"'를 사용하여 두 fscanf를 하나로 결합 할 수 있습니다. 이 글을 쓰면서 버퍼 오버 플로우가 발생할 수도 있습니다. 작동하지 않는 코드의 형식 문자열은 단어 크기를 80으로 제한하기 위해' "% 80s"'이어야합니다. – user3386109
응답 해 주셔서 감사합니다. "% 80s"로 변경하면 같은 결과가 발생합니다. –