staivoup:
Wenn du fertigen Code zur Hand hast, wäre das sehr Knorke.
Wenn ich Code zur Hand habe, dann habe ich den Code vorher auch geschrieben, der fliegt mir nicht einfach zu.
Erstmal mußt Du wissen, was Du eigentlich möchtest:
Möchtest Du nur in den Strings nach Ziffern suchen?
Oder möchtest Du tatsächlich ganze Strings vergleichen?
Beispielcode: "Ziffern suchen in einem zweidimensionalen char-Array" (String-Array mit fester Länge für jedes Element):
char myStrings[][19]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6","no digit in string"};
int stringnummer(char* suchw){
for (int i=0;i<strlen(suchw);i++)
{
if (isdigit(suchw[i])) return suchw[i]-'0'; // ASCII-code in byte umwandeln und zurückliefern
}
return -1;
}
void setup(){
Serial.begin(9600);
for (int i=0;i<7;i++)
{
Serial.print(myStrings[i]);
Serial.print('\t');
Serial.println(stringnummer(myStrings[i]));
}
}
void loop(){
}
Der Code sucht Zeichen für Zeichen in einem String nach einer Ziffer, und liefert die gefundene Ziffer als Byte-Wert zurück, andernfalls -1.
Hier nochmal quasi derselbe Code, allerdings als Array von char-Pointern deklariert:
char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6","no digit in string"};
int stringnummer(char* suchw){
for (int i=0;i<strlen(suchw);i++)
{
if (isdigit(suchw[i])) return suchw[i]-'0'; // ASCII-code in byte umwandeln und zurückliefern
}
return -1;
}
void setup(){
Serial.begin(9600);
for (int i=0;i<7;i++)
{
Serial.print(myStrings[i]);
Serial.print('\t');
Serial.println(stringnummer(myStrings[i]));
}
}
void loop(){
}
Im Code ändert sich nichts, nur das Array ist anders deklariert. Zu beachten wäre, dass wenn Du einen String als Char-Array zur Verarbeitung an eine Funktion übergibst, dann übergibst Du als Typ immer einen Char-Pointer, also "char*". Entweder so:
int stringnummer(char* suchw)
oder so:
int stringnummer(char *suchw)
D.h. ob das Pointerzeichen '*' num beim Typnamen oder beim Namen der Variablen steht und wo sich das Leerzeichen befindet, wäre dem Compiler in dem Fall egal.
Und hier jetzt noch eine Variante, bei der nicht nach einer einzelnen Ziffer gesucht wird, sondern bei der ein Suchstring vorgegeben wird, und es wird nach dem String gesucht:
char* myStrings[]={"This is string 1", "This is string 2", "This is string 3",
"This is string 4", "This is string 5","This is string 6","no digit in string"};
#define NUMSTRINGS (sizeof(myStrings)/sizeof(myStrings[0]))
char suchwort[] = "This is string 5";
void setup(){
Serial.begin(9600);
for (int i=0;i<NUMSTRINGS;i++)
{
if (strcmp(myStrings[i], suchwort)==0)
{
Serial.print("Suchwort gefunden mit Array-Index: ");
Serial.println(i);
}
}
}
void loop(){
}
Die Funktion aus der AVR libc Library, mit der Strings verglichen werden, heißt "strcmp", was für "string compare" steht.
Funktion strcmp im Manual der AVR LIBC
D.h. um zwei Strings auf Gleichzeit zu testen, brauchst Du Dir überhaupt keine eigene Funktion zu schreiben, sondern das ist eine Standardfunktion aus der Library. Und daher würdest Du im Falle eines Stringsvergleichs auch einfach eine Standardfunktion (z.B. 'strcmp') aufrufen und keine eigene Funktion dafür schreiben.
Übrigens genau so, wie ich in der zuerst geposteten Variante (Suchen nach einer Ziffer im String) für die Prüfung, ob ein Zeichen eine Ziffer ist, auch keine eigene Funktion geschrieben habe, sondern die 'isdigit' Funktion verwendet habe.
Wenn Du mit Arduino programmierst, dann ist die "AVR LIBC" neben den Arduino Core-Libraries erstmal der wichtigste Fundus an Library-Funktionen, in dem Du viele grundlegenden Operationen für Mathematik, Stringbehandlung und so weiter findest. Die Library-Referenz ist online hier verfügbar.