Frage von Ucanaskme, 15

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

include

include

include

int main(int argc, char *argv[])

{

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);

char* Ergebnis;

Ergebnis=strstr(Text,Such);

printf("Suchergebnis:%s\n\n",Ergebnis);

if(Ergebnis==0){


    printf("Keine Uebereinstimmung. Kein Ergebnis.\n\n");


    return -9;



}


printf("%s", Text);

system("PAUSE");

return 0;

}

Das ist der momentane Code. Wie kann ich dem Benutzer jetzt letztendlich den Ursprungstext ausgeben, wobei die Suche bzw das Ergebnis markiert wird? Außerdem: wie kann man nur das gesuchte Wort zeigen, nicht den Rest?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von mondai, 5

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;
}
Kommentar von Ucanaskme ,

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...)

Kommentar von mondai ,

Hey, danke für die positive Rückmeldung. XD

Doch mit diesem Code ist schon möglich, auch wenn
'//' ein mit C++ eingeführter einzeiliger Kommentar ist. ;p

Sicher kann man so etwas auch in HTML & JS machen.
Nur ob es unbedingt leicht ist, sei mal dahin gestellt.
Denn auch dort sind Kenntnisse zu Lösungsansätzen notwendig.
Letztenendes sind es aber auch persönliche Anforderungen und
der damit verbundene Verwendungszweck.

Das mit dem gewusst, kann man nur teilweise so bezeichen.
Durch eine gewisse Erfahrungen ist es zwar möglich, zwischen
den ein oder anderen Lösungsansätzen abzuwägen, aber den
genauen Aufbau von allen Strukturen oder existierenden
System-Funktionen zu kennen ist eher unwahrscheinlich.

Zum Beispiel 「CONSOLE_SCREEN_BUFFER_INFO」
ist hier beschrieben: https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms682093%28v=vs.85%29.a...

Oder die Attribute: [MSDN-Link] + [#_win32_character_attributes]

Auf dieser Seite können dann auch Funktionen wie:
    - GetStdHandle(...)
    - SetConsoleTextAttribute(...)
    - GetConsoleScreenBufferInfo(...)

    nachgeschlagen werden.

Okay, ich bin einfach mal von Windows ausgegangen. ;p
Aber sicher gibt es da auch Nachschlagemöglichkeiten.
Oder zumindest eine Art SDK-Dokumentation.
Eventuell wird es da eher in Richtung Objective-C gehen.

developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/iPhoneOSTechOverview/iPhoneOSFrameworks/iPhoneOSFrameworks.html

developer.apple.com/library/ios/documentation/UIKit/Reference/UILabel_Class/

stackoverflow.com/questions/1340224/iphone-uitextfield-change-placeholder-text-color

Vielleicht sind auch ein paar Steuersequencen zu finden.
Beispiel - Liste für Linux:

# Color Reset
   Color_Off="\033[0m" # Text Reset

# Regular Colors
   Black="\033[0;30m" # Black
   Red="\033[0;31m" # Red
   Green="\033[0;32m" # Green
   Yellow="\033[0;33m" # Yellow
   Blue="\033[0;34m" # Blue
   Purple="\033[0;35m" # Purple
   Cyan="\033[0;36m" # Cyan
   White="\033[0;37m" # White

# Bold
   BBlack="\033[1;30m" # Black
   BRed="\033[1;31m" # Red
   BGreen="\033[1;32m" # Green
   BYellow="\033[1;33m" # Yellow
   BBlue="\033[1;34m" # Blue
   BPurple="\033[1;35m" # Purple
   BCyan="\033[1;36m" # Cyan
   BWhite="\033[1;37m" # White

# Underline
   UBlack="\033[4;30m" # Black
   URed="\033[4;31m" # Red
   UGreen="\033[4;32m" # Green
   UYellow="\033[4;33m" # Yellow
   UBlue="\033[4;34m" # Blue
   UPurple="\033[4;35m" # Purple
   UCyan="\033[4;36m" # Cyan
   UWhite="\033[4;37m" # White

# Background
   On_Black="\033[40m" # Black
   On_Red="\033[41m" # Red
   On_Green="\033[42m" # Green
   On_Yellow="\033[43m" # Yellow
   On_Blue="\033[44m" # Blue
   On_Purple="\033[45m" # Purple
   On_Cyan="\033[46m" # Cyan
   On_White="\033[47m" # White

# High Intensty
   IBlack="\033[0;90m" # Black
   IRed="\033[0;91m" # Red
   IGreen="\033[0;92m" # Green
   IYellow="\033[0;93m" # Yellow
   IBlue="\033[0;94m" # Blue
   IPurple="\033[0;95m" # Purple
   ICyan="\033[0;96m" # Cyan
   IWhite="\033[0;97m" # White

# Bold High Intensty
   BIBlack="\033[1;90m" # Black
   BIRed="\033[1;91m" # Red
   BIGreen="\033[1;92m" # Green
   BIYellow="\033[1;93m" # Yellow
   BIBlue="\033[1;94m" # Blue
   BIPurple="\033[1;95m" # Purple
   BICyan="\033[1;96m" # Cyan
   BIWhite="\033[1;97m" # White

# High Intensty backgrounds
   On_IBlack="\033[0;100m" # Black
   On_IRed="\033[0;101m" # Red
   On_IGreen="\033[0;102m" # Green
   On_IYellow="\033[0;103m" # Yellow
   On_IBlue="\033[0;104m" # Blue
   On_IPurple="\033[10;95m" # Purple
   On_ICyan="\033[0;106m" # Cyan
   On_IWhite="\033[0;107m" # White

Das logische Verknüpfen von Werten ist auch in folgendem
Beispiel ganz praktisch:
/**************************************/
#define BINARY        0x1
#define LESEN          0x2
#define SCHREIBEN 0x4
/**************************************/
// 0x3   (LESEN          | BINARY                       )
// 0x3   (LESEN          | BINARY       | BINARY )
// 0x5   (SCHREIBEN | BINARY                       )
// 0x6   (LESEN          | SCHREIBEN                )
// 0x7   (LESEN          | SCHREIBEN | BINARY)

Tipp: Rücke dir den Code immer so zurecht, dass er für dich
         übersichtlich ist und schreibe im Zweifelsfall lieber
         einen Kommentar mehr als einen zu wenig.
         Vielleicht hilft dir auch die "Ungarische Notation".
         Aussagekräftige Variablen-/ Funktionsnamen können die
         Lesbarkeit ebenfalls enorm erleichtern.

PS: Die Argumente (int argc, char *argv[]) sind für den
       aktuellen Stand des Programms nicht unbedingt notwendig.

Viel Spaß noch beim herumexperimentieren! XD

Antwort
von KnorxyThieus, 4

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? :)

Keine passende Antwort gefunden?

Fragen Sie die Community