Du bist nicht angemeldet.

psycho

Fortgeschrittener

  • »psycho« ist der Autor dieses Themas

Beiträge: 413

Registrierungsdatum: 26.06.2011

Danksagungen: 80

  • Private Nachricht senden

1

16.06.2014, 20:09

C++ find array

Kann mir jemand sagen was an dem Code falsch ist?
Ich bekomme immer eine Fehlermeldung find Bezeichner nicht gefunden, obwohl <string> includiert ist.

Quellcode

1
2
3
4
5
bool letterInArray(char letter,char arr[]) {
	char* end = arr + sizeof(arr)/sizeof(arr[0]);
	char* position = find(arr, end, letter);
	return (position != end);
}


Notfalls akzeptiere ich auch einen anderen Weg einen Buchstaben in einem Char-Array zu finden.

Danke für eure Hilfe schonmal.
Computer sind dazu da, uns die Arbeit zu
erleichtern, die wir ohne sie gar nicht hätten.

liro

Fortgeschrittener

Beiträge: 180

Danksagungen: 36

  • Private Nachricht senden

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

3

16.06.2014, 22:49

Mir sind hier ein paar Sachen aufgefallen:
  1. sizeof wird vom Compiler und nicht zur Laufzeit ausgewehrtet. sizeof(arr) kann also nicht wissen, wie viele Elemente zukünftig in arr enthalten sein werden (Vermutlich wird das Ergebnis die Größe eines Zeigers, also 4 (32 Bit) oder 8 (64 Bit) sein, da in C im wesentlichen gilt: char arr[] entspricht char *arr). Ganz davon abgesehen, ist es zur Laufzeit generell nicht möglich, die Größe eines Arrays abzufragen, da diese nicht gespeichert wird. Solltest du diese Information später benötigen, musst du sie in einer extra-Variablen speichern. Im Falle eines gültigen c-Strings ist die Länge des Strings (nicht des char-Arrays) durch strlen abrufbar, da das Ende eines c-Strings immer mit einem '\0' makiert wird.
  2. sizeof(arr[0]) wird vermutlich nur die Größe von char (also 1) zurück geben. Hier würde ich zum besseren Verständnis sizeof(char) schreiben.
  3. find ist nach dieser Seite in <algorithm> und nicht in <string> definiert.


Hier mal ein Beispiel, wie ich es für c-Strings unter der Verwendung von find implementieren würde. Da ich den Code jetzt nicht getestet habe, könnten aber auch noch Fehler enthalten sein.

C/C++-Quelltext

1
2
3
4
5
bool letterInArray(char letter, const char arr[]) {
	char* end = arr + strlen(arr); // sizeof(char) nicht nötig, siehe Zeigerarithmetik
	char* position = find(arr, end, letter);
	return (position != end);
}


Im Fall eines Strings könnte man die Suche aber auch komplett selber schreiben:

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
bool letterInArray(char letter, const char *arr) {
	while (*arr != '\0') {
		if (*arr == letter) {
			return true;
		}
		++arr;
	}
	return false;
}


EDIT: Falls es hier nicht um Strings geht, musst du die Länge des Arrays mit übergeben. Hier ein Beispiel für die Implementierung:

C/C++-Quelltext

1
2
3
4
5
6
7
8
9
template <typename T>
bool isInArray(const T &needle, const T haystack[], size_t len) {
	for (size_t i = 0; i < len; ++i) {
		if (haystack[i] == needle) {
			return true;
		}
	}
	return false;
}
Signatur ?

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Johannes S.« (16.06.2014, 23:23)


psycho

Fortgeschrittener

  • »psycho« ist der Autor dieses Themas

Beiträge: 413

Registrierungsdatum: 26.06.2011

Danksagungen: 80

  • Private Nachricht senden

4

16.06.2014, 23:33

Das witzige ist, dass ist kopiert von Stackoverflow... nur die Parameter angepasst.

Aber das danke für die ausführliche Antwort.
Werde ich morgen gleich testen ;)

EDIT:

Danke hat perfekt funktioniert... War Teil einer Hausaufgabe für eine Freundin :P Die Uniaufgaben sind manchmal recht interessant...
Computer sind dazu da, uns die Arbeit zu
erleichtern, die wir ohne sie gar nicht hätten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »psycho« (17.06.2014, 12:18)


Ähnliche Themen