Programm zum Auffinden von doppelten Wörtern
Weil mir aufgefallen ist, das doppelte Wörter wie z. B.
... hier zu sehen ist ist, besteht ...
auch von Korrekturlesern selten gefunden werden, habe ich deshalb mal ein C-Programm geschrieben:
Code:
// extractdouble.c:
// Extrahiert die doppelten benachbarten Wörter einer Datei.
// Nebenbei wird noch die Anzahl der Wörter (incl. Steuer-Wörter u. a.), die Zeilen-Anzahl und
// Zeichen-Anzahl ausgegeben.
#include <assert.h>
#include <math.h>
#include <string.h>
#include <setjmp.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <vga.h>
#include <signal.h> // signals
void
sig_handler(int sig) // signal handler
{
printf ("\a\a\a\a\a\a\aSignal %d - program exiting... \r\n\a\a\a", sig);
exit(0);
}
int main(int argc, char *argv[])
{
int nc=0, nl=0, nw=0, wf=0, cc=0; // number of chars, number of lines, number of words, word-flag, (word-)char-counter
FILE *ifp=NULL; /* Eingabe-File */
char c='\0', word[2][999999]={{'\0'}};
signal(SIGHUP, sig_handler);
signal(SIGINT, sig_handler);
signal(SIGQUIT, sig_handler);
signal(SIGILL, sig_handler);
signal(SIGTRAP, sig_handler);
signal(SIGIOT, sig_handler);
// signal(SIGEMT, sig_handler);
signal(SIGFPE, sig_handler);
signal(SIGKILL, sig_handler);
signal(SIGBUS, sig_handler);
signal(SIGSEGV, sig_handler);
signal(SIGSYS, sig_handler);
signal(SIGPIPE, sig_handler);
signal(SIGALRM, sig_handler);
signal(SIGTERM, sig_handler);
signal(SIGABRT, sig_handler);
ifp=fopen(argv[1],"r");
while ( (c=getc(ifp)) != EOF ) /* zeichenweises Einlesen bis Dateiende */
{
++nc;
if ( c == '\n' ) // line end
++nl;
if ( ( c == ' ' ) || ( c == '\n' ) || ( c == '\t' ) ) // word end
{
wf=0;
}
else // inside a word
{
if ( wf == 0 ) // Der Anfang eines neuen Wortes wurde erreicht.
{
word[nw%2][cc++]='\0'; // end of the last word
cc=0;
wf=1;
++nw;
if ( ( nc > 1 ) && ( strcmp(word[0], word[1]) == 0 ) ) // two equal words after the first character
{
printf("Double words in line %d: %s %s\n",nl+1,word[0],word[1]);
}
}
word[nw%2][cc++]=c; // write the first word to word[0][..., the second to word[1], the third to word[0][...
}
}
printf("%d Lines, %d Words, %d Characters\n",nl,nw,nc);
return(0);
}
Damit habe ich in meiner Doktorarbeit auch nach (teilweise mehrfachem) Korrekturlesen von 3 Fachleuten noch über 10 Fehler beseitigen können!
Hier ist mal ein typisches Beispiel mit dem Programm:
> extractdouble doctple.tex
Double words in line 796: der der
Double words in line 884: eine eine
1007 Lines, 6476 Words, 51162 Characters
Gibt es außer ispell eigentlich auch andere Programme zum automatischen "Korrekturlesen", so wie dieses extractdouble? :confused: