Ich esse Fleisch auch sehr gerne, aber Tofu ebenfalls. Vielleicht ist es einfach nur ungewohnt für dich, aber die Geschmäcker sind eben verschieden. :)
Diese Meldung heißt übersetzt so viel wie: "Avast taugt - wie alle anderen Antivirenprogramme auch - überhaupt nichts, und muss mithilfe von Drückermethoden jeden Pups so weit aufblähen, damit naive Leute für diesen Müll auch noch Geld ausgeben" :)
Ich kaufe mir immer die "offiziellen" Arduinos im Familienpack und dazu den ganzen Elegoo-Kram einzeln.
Das ist in der Summe billiger, man Unterstützt die Firma Arduino, und man kann sich genau zusammen stellen, was man alles haben möchte. :)
Also nehmen wir mal an, du hast eine Smiley-Datenbank in Form einer Textdatei, mit folgendem Inhalt:
😀 smiley
😁 happy
😇 angel
😈 devil
😞 sad
😠 angry
😮 oh
😱 munch
😴 sleep
(Ich weiß, es gibt noch viel mehr, aber das soll jetzt nur ein Beispiel sein!)
Dann kannst du mit folgendem Codeschnipsel Smileys durch Textrepräsentation und umgekehrt in einem Text ersetzen:
import codecs
smiley_text = {}
text_smiley = {}
with codecs.open('smileys.txt', 'r', 'utf-8', 'strict') as fh:
for line in fh:
if ' ' not in line:
continue
smiley, text = line.strip().split(' ', 1)
text = ':%s:' % text
smiley_text[smiley] = text
text_smiley[text] = smiley
message = '''
Das ist das Haus, vom Nikolaus. :happy:
Und das nebenan, vom Weihnachtsmann. :smiley:
'''.strip()
print('ORIGINAL:\n%s' % message)
for text, smiley in text_smiley.items():
if text in message:
message = message.replace(text, smiley)
print('REPLACE A:\n%s' % message)
for smiley, text in smiley_text.items():
if smiley in message:
message = message.replace(smiley, text)
print('REPLACE B:\n%s' % message)
Damit erhältst du folgende Ausgabe:
ORIGINAL:
Das ist das Haus, vom Nikolaus. :happy:
Und das nebenan, vom Weihnachtsmann. :smiley:
REPLACE A:
Das ist das Haus, vom Nikolaus. 😁
Und das nebenan, vom Weihnachtsmann. 😀
REPLACE B:
Das ist das Haus, vom Nikolaus. :happy:
Und das nebenan, vom Weihnachtsmann. :smiley:
Wie du siehst, funktioniert die Ersetzung damit recht einfach. Die entsprechende Funktionalität musst du dir natürlich noch selber in eine Klasse oder schicke Funktionen verpacken, aber so siehst du erst mal, wie das im Großen und Ganzen funktioniert.
Disclaimer: Ich weiß, dass der Code nicht allzu optimal ist, aber da er möglichst auch für Anfänger ohne große Vorkenntnisse verständlich sein soll, will ich jetzt nicht übertreiben.
Aus Effizienzgründen würde ich normalerweise mit einem Iterator über "message" gehen, aber das würde den Code deutlich vergrößern.
Viele C-Programmierer machen leider den Fehler, und schreiben ihre Strukturen wie folgt in eine Datei:
struct Foo {
int i;
char c;
};
typedef struct Foo Foo;
/* ... */
Foo foo = { 0, 0 };
FILE *fh = fopen("file.bin", "wb");
/* ... */
fwrite(&foo, sizeof(foo), 1, fh);
Bitte beachte die letzte Zeile des Codeschnipsels: Genau SO sollte man es eben NICHT machen! :)
Das verstößt gegen den Standard, ist undefiniertes und damit nicht portables Verhalten, und reißt Datenlecks bzw. Sicherheitslücken auf.
Der einzige richtige Weg, Strukturen zu schreiben, ist Member für Member:
fwrite(&foo.i, sizeof(foo.i), 1, fh);
fwrite(&foo.c, sizeof(foo.c), 1, fh);
Wer sich für Details interessiert: Falls ich mich nicht irre, hat sowohl Cert-C als auch MISRA-C eine Guideline dazu, und im Buch "Secure Coding in C and C++" gibt es ein Unterkapitel zu dem Thema ... falls ich nicht gerade den Buchtitel mit einem anderen verwechsel.
Auf jeden Fall hat es enorm viele Nachteile und ist genau genommen ein Bug, wenn man Strukturen als Ganzes, und nicht Elementweise schreibt. Und Packing ist sowieso nicht portabel, also am besten entsprechende #pragma oder __attribute__ Direktiven verkneifen, es sei denn, man möchte sich an einen einzigen Compilerhersteller binden. :)