Wie kann ich einen einzelnen String der im Text gefunden wurde farblich hervorheben?

... komplette Frage anzeigen

2 Antworten

Hallo! Dein Code sieht nun folgendermaßen aus:

Hinweis: Bei den INCLUDES sind die spitzen Klammern noch zu setzen.
               Anders wollte es sich nicht kopieren lassen.

#include stdio.h
#include windows.h // stdlib.h und string.h muessen nicht mehr mit eingebungen werden
// stdlib.h war nur wegen system("PAUSE"); notwendig | Alternative: getchar();
int main(int argc, char *argv[])
{/******************************************************************************************************** windows.h *****/
HANDLE hOwnOutput = GetStdHandle ( STD_OUTPUT_HANDLE ); // Output-Handle von diesem Fenster abfragen.
// Die aktuellen Farbwerte abfragen und speichern, damit die Ausgangswerte nicht verloren gehen.
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;GetConsoleScreenBufferInfo(hOwnOutput, &csbiInfo);
WORD wOldColors = csbiInfo.wAttributes; /*CONSOLE_SCREEN_BUFFER_INFO
COORD dwSize - Fensterpuffer Zeilen-/Spalten-Anzahl
COORD dwCursorPosition - Position(X, Y) des Cursors im Fenster
WORD wAttributes - Informationen zu Zeicheneigenschaften
SMALL_RECT srWindow - Fensterkoordinaten oben-linke / unten-rechts
COORD dwMaximumWindowSize - Maximale Fenstergroe3e als Zeilen-/Spalten-Anzahl
/*----------------------------------------------------------------------------------------------------------------------*/
SetConsoleTextAttribute ( hOwnOutput, FOREGROUND_GREEN | FOREGROUND_INTENSITY ); // Die neue Textfarbwerte setzen.
puts("Hallo!");// Dieser Text benutzt die neuen Werte.
SetConsoleTextAttribute ( hOwnOutput, wOldColors);// Ausgangsfarbwerte wieder herstellen.
/************************************************************************************************************************/
/* FOREGROUND_GREEN | FOREGROUND_INTENSITY => 10*/
/* 0x0002 0x0008 => 0x000A*/
/**/
/*Siehe auch:[Win]+[R] -> CMD -> COLOR ? | Werte(0-F)*/
/************************************************************************************************************************/
/*FOREGROUND_BLUE 0x0001*/
/*FOREGROUND_GREEN 0x0002*/
/*FOREGROUND_RED 0x0004*/
/*FOREGROUND_INTENSITY 0x0008*/
/**/
/*BACKGROUND_BLUE 0x0010*/
/*BACKGROUND_GREEN 0x0020*/
/*BACKGROUND_RED 0x0040*/
/*BACKGROUND_INTENSITY 0x0080*/
/**/
/*COMMON_LVB_LEADING_BYTE*/
/*COMMON_LVB_TRAILING_BYTE*/
/*COMMON_LVB_GRID_HORIZONTAL*/
/*COMMON_LVB_GRID_LVERTICA*/
/*COMMON_LVB_GRID_RVERTICAL*/
/*COMMON_LVB_REVERSE_VIDEO - FOREGROUND / BACKGROUND*/
/*COMMON_LVB_UNDERSCORE*/
/************************************************************************************************************************/
char Text[1000];
printf("Geben Sie einen Text ein, in dem Sie etwas suchen moechten.(Maximal 999 Zeichen!)\\n\\n");
fgets(Text, 1000, stdin);

char Such[500];
printf("Geben Sie nun ein, wonach Sie suchen wollen.\\n\\n");
fgets(Such, 500, stdin);
/************************************************************************************************************************/
Such[strlen(Such)-1] = '\\0'; // Das mit eingelesene Enter am Ende entfernen -> Fehler beim Vergleich!
// Kurzversion:Such[strlen(fgets(Such, 500, stdin))-1] = '\\0';
/************************************************************************************************************************/

char* Ergebnis = strstr(Text, Such); // Ergebnis[strlen(Such)] = '\\0'; // !!! Diese Variante veraendert den Ausgangstext direkt !!!
printf("Suchergebnis:%s\\n\\n",Ergebnis);/*printf("\\""); // Diese Variante veraendert den Ausgangstext nicht!
int TxtLen = strlen(Such);
for(short i = 0; i < TxtLen; i++) printf("%c",Ergebnis[i]);
puts("\\"");
*/
if (Ergebnis == 0){
printf("Keine Uebereinstimmung. Kein Ergebnis.\\n\\n");
return -9;
}
printf("%s", Text);
// Hier mal eine Moeglichkeit, wie man nur den gesuchten Text hervorheben kann:
/************************************************************************************************************************/
int Text_Start = Ergebnis - Text;// Anzahl Zeichen bis zum gefundenen Text.
int Text_Mitte = Text_Start + strlen(Such);// Um Laenge des gesuchten Textes erweitern.
int Text_Ende = strlen(Text);// Um Anzahl der restlichen Zeichen erweitern
int Index = 0 ;// Aktuelle Position im Ausgangstext.
// Ersten Textteil ausgeben, Schriftfarbenwerte setzen, gesuchten Text in neuer Farbe ausgeben, Ausgangsschriftfarbenwerte herstellen, Resttext ausgeben.
for(Index = 0; Index < Text_Start; Index++) printf("%c",Text[Index]); SetConsoleTextAttribute ( hOwnOutput, FOREGROUND_GREEN | FOREGROUND_INTENSITY );
for( ; Index < Text_Mitte; Index++) printf("%c",Text[Index]); SetConsoleTextAttribute ( hOwnOutput, wOldColors);
for( ; Index < Text_Ende ; Index++) printf("%c",Text[Index]);
/************************************************************************************************************************/
system("PAUSE");
return 0;
}
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Ucanaskme
24.03.2016, 16:46

Ja.

(wusstest Du das oder hast Du da etwas nachgeschlagen?!?)

Also zuerst auf jeden Fall einmal vielen Dank. 

Die Antwort werde ich mal als die hilfsreichste auszeichnen.

Also auf den Code wäre ich jetzt so nicht gekommen, bei Google meinen auch alle möglichen, dass man das nicht in C machen kann.

Für mich ist der Code jetzt so, als würde ich das erste mal im Leben überhaupt irgendeinen Source Code sehen...(also ich blicke da nicht ganz durch, nur so bis zum ersten einhundertachtundzwanzigstel, was aber wohl an meinen C Kenntnissen liegt, die nicht soo überragend sind.)

Lässt sich so etwas in HTML bzw mit JS leichter machen?

Also dann sozusagen als Website? Wegen der Farben ja wohl schon.

(Jetzt kommt das Kleingedruckte)

momentan compiliere ich (und schreibe) auf IOS, also einem Mobilgerät mittels App. Deswegen wird Windows.h wahrscheinlich nicht hinhauen.

Aber ich werde das demnächst dann auch mal am PC versuchen (wie schon gesagt, ich habe erst vor etwa 1 1/2 Jahren begonnen...)

0

Sicher, dass du CSharp meinst, wie du geschrieben hast? Das sieht mir doch sehr nach C/C++ aus!

Ansonsten wäre mein Ansatz allgemein: Ersten Teil des Textes - vor dem Treffer ausgeben, dann die Schriftfarbe umstellen, den Treffer ausgeben, Schriftfarbe zurückstellen, Text hinter dem Treffer ausgeben. Hilft das weiter? :)

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?