PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm zum Auffinden von doppelten Wörtern



nobody0
01-12-2002, 14:13
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:




// 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:

Wolf
03-12-2002, 00:27
Find ich klasse die idee!

Ich kenn momentan keins. Und ich glaub auch emacs hat keine Funktion die das beinhaltet......wenn ich mich irre bitte posten:

gleich mal testen:-)

nobody0
03-12-2002, 02:31
Aha.
Nach Kernighan/Ritchi (C-Übungsbuch) habe ich noch eine Erweiterung zum Überprüfen des Klammer-Gleichgewichts eingebracht, wobei entscheidend war, zusätzlich die Zeile mit dem ersten Fehler richtig zu bestimmen. Solche ganz simplen Syntax-Überprüfungen, die schon lange bekannt sind, sollte doch eigentlich fast jedes Textverarbeitungsprogramm haben. Gibt es sowas wirklich nicht in Textverarbeitungsprogrammen wie ein aktuelles Microsoft Word (das ich nicht habe, aber bei dem Preis sowas mindestens haben müsste)? :confused: