Hallo,
Ziel meines neuen Programms ist es einen char-Array von Anfang bist Ende mit Charmatching zu durchlaufen und die Anzahl der Chars zurückzugeben die durchlaufen wurden bis in dem String ein "a" vorkommt.
Ich hätte damit gerechnet dass das Programm 10 anzeigt, stattdessen zeigt es 345 an. Die zahl die angezeigt wird variiert mit der Änderung der Puffergröße, aber nach einem nicht nachvollziebaren Muster. Außerdem gibt der Debugger eine Warnung aus:Code:int main () { char puffer[30] = {"123456789a"}; char key = "a"; int i; for (i=0; puffer[i] != key; i++); printf ("%d ", i+1); return 0; }
damit ist der key-char gemeint. Weiß aber nicht was der von mir will. Die Fehlermeldung würde mich auch garnicht stören wenn das Programm laufen würde...Line|3|:warning: initialization makes integer from pointer without a cast|
-
01.12.2009, 12:56 #1
[C] Stringlänge im Puffer zurückgeben
GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
X6 1055T + Scythe Mugen B,
Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
CM690II+, W7pro
ultra silent
- Anzeige
Logge dich ein, um diese Anzeige nicht zu sehen. -
01.12.2009, 13:23 #2
[C] AW: Stringlänge im Puffer zurückgeben
char key = "a"; geht nicht wirklich. Da versuchst du, auf einen char einen string zu schreiben, was ja in C ein Pointer auf die Anfangsadresse ist.
Diese Fehlermeldung kriegst du weg, indem du char key = 'a'; schreibst.
Vielleicht löst sich das ganze Problem dann auch in Wohlgefallen auf.System: Intel C2Q 8300, Asus P5QL-E, 4GB, HD4670, Samsung 830 256GB SSD, Samsung F1 640GB, Samsung 500GB, Windows 7 x64 Professional, HP ZR 2440w.
Multimedia: Yamaha RX-V473, 2x Canton GLE 490, Asus O!Play Air, Panasonic DMR EH 495 an einem Toshiba Regza 26A300P. Storage übernimmt ein Synology DS-211j mit 2x 3TB im RAID1.
+ Richtig Posten + Probleme mit Partitionen? + Du suchst einen Dateimanager? + Probleme mit Hardware sicher entfernen? +
-
01.12.2009, 23:22 #3
[C] AW: Stringlänge im Puffer zurückgeben
Jetzt funktioniert's, Danke =)
GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
X6 1055T + Scythe Mugen B,
Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
CM690II+, W7pro
ultra silent
-
02.12.2009, 02:46 #4
[C] AW: Stringlänge im Puffer zurückgeben
Jetzt - in Deinem speziell hier vorgetragenen Fall - vielleicht. Die Implementierung ist in der aktuellen (und selbst in der korrigierten, syntaktisch korrekten) Form nicht für alle Eingabewerte ausreichend durchdacht und abgesichert!
Stell Dich schon einmal auf eine Zugriffsverletzung ein, wenn <key> nicht in <puffer> vorkommt!Code:int main () { char puffer[30] = {"123456789a"}; char key = 'a'; int i; for (i=0; puffer[i] != key; i++); printf ("%d ", i+1); return 0; }Geändert von XunnD (02.12.2009 um 02:49 Uhr)
-
02.12.2009, 08:00 #5
[C] AW: Stringlänge im Puffer zurückgeben
Im Endeffekt wollte ich die ganze Sache nach einem '\0' Suchen lassen.
Gibt es denn Fälle in denen ein String nicht mit einem '\0' beendet wird? Ich war mir Anfangs nur unsicher ob das so klappt mit dem '\0', aber scheinbar geht's.Code:# include <stdio.h> int main () { char puffer[1000]; scanf ("%s", puffer); fflush (stdin); char key = '\0'; int i; for (i=0; puffer[i] != key; i++); printf ("%d ", i); return 0; }Geändert von foggy80 (02.12.2009 um 08:06 Uhr)
GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
X6 1055T + Scythe Mugen B,
Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
CM690II+, W7pro
ultra silent
-
02.12.2009, 11:08 #6claW.Gast
-
02.12.2009, 13:10 #7
[C] AW: Stringlänge im Puffer zurückgeben
also bei mir funktionierts.Code:int strzahl (char *str) { char key = '\0'; int i; for (i=0; str[i] != key; i++); printf ("String besteht aus %d Zeichen", i); return 0; } int main () { char *oordner = {"12345"}; char *uordner = {"12345678"}; char uadresse[300]; strncpy (uadresse, oordner, 6); strncat (uadresse, uordner, 8); printf ("%s\n", uadresse); strzahl (uadresse); return 0; }Geändert von foggy80 (02.12.2009 um 13:12 Uhr)
GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
X6 1055T + Scythe Mugen B,
Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
CM690II+, W7pro
ultra silent
-
02.12.2009, 20:59 #8claW.Gast
[C] Re: Stringlänge im Puffer zurückgeben
code:
ausgabe:Code:#include <iostream> using std::cout; using std::endl; int main( int argc, char **argv, char **env ) { char str[50]; strncpy( str, "abc", 3 ); strncat( str, "def", 3 ); cout << str << endl; system( "pause" ); return 0; }
Code:abc╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠& úx©*↕def Drücken Sie eine beliebige Taste . . .
-
02.12.2009, 22:48 #9
[C] AW: Stringlänge im Puffer zurückgeben
von c++ versteh ich keine Bohne, also versteh ich das nicht.
GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
X6 1055T + Scythe Mugen B,
Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
CM690II+, W7pro
ultra silent
-
02.12.2009, 22:55 #10claW.Gast
[C] Re: Stringlänge im Puffer zurückgeben
verstehst du das jetzt besser?Code:#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char str[50]; strncpy( str, "abc", 3 ); strncat( str, "def", 3 ); printf( "%s\r\n", str ); system( "pause" ); return 0; }
-
03.12.2009, 00:15 #11
[C] AW: Stringlänge im Puffer zurückgeben
die anzahl der chars bei strncpy muss 4 sein, sonst funktioniert es nicht.
GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
X6 1055T + Scythe Mugen B,
Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
CM690II+, W7pro
ultra silent
-
03.12.2009, 02:02 #12claW.Gast
[C] Re: Stringlänge im Puffer zurückgeben
ich wollte dir nur aufzeigen was passiert, wenn du das \0 weglässt. dass dort noch ein \0 eingefügt werden muss, war doch gar nicht der sinn der sache. dass man mit strncpy/strncat auch auf "normalem" wege arbeiten kann, das hab ich doch gar nicht gemeint.
-
03.12.2009, 11:34 #13
[C] AW: Stringlänge im Puffer zurückgeben
Ich versteh's aber trotzdem nicht, muss man da bei strncpy einen Char mehr nehmen wegen dem \0? Und wieso nicht bei strncat?
GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
X6 1055T + Scythe Mugen B,
Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
CM690II+, W7pro
ultra silent
-
03.12.2009, 18:04 #14
[C] AW: Stringlänge im Puffer zurückgeben
Damit C-String-Funktionen korrekt funktionieren, muss der Basispuffer mindestens ein \0 aufweisen.
"abc" entspricht im Speicher abc\0
"def" enspricht demnach def\0
wenn man jetzt nur 3 Bytes kopiert, wird das \0-Zeichen entsprechend weggelassen.
Bei strncpy macht das noch nicht viel Unterschied, außer, dass der String für weitere Stringfunktionen aufgrund des fehlenden Nullterminators unbrauchbar wird. strncpy fängt direkt an Offset 0 des übergebenen Puffers mit Schreiben an, also an der Basis-Adresse von str.
strncat SUCHT nach dem Nullzeichen und hängt dort die Buchstaben 'd' 'e' und 'f' an - allerdings wieder ohne Nullzeichen.
strcpy(x,y) auf der anderen Seite hingegen kopiert alle Zeichen aus y nach x, inklusive dem Nullterminator und bricht beim Auffinden des Nullzeichens ab.
-
03.12.2009, 20:00 #15
[C] AW: Stringlänge im Puffer zurückgeben
*eek* Der Compiler versucht dir hier klar zu machen, dass der Code falsch ist. Sollte spontan auch garnicht kompilieren dürfen. Warnings solltest du immer (!) als Fehler betrachten und ernst nehmen. Du kannst hier auch gerne immer Fragen, wenn du eine Warning nicht verstehst. Dafür sind wir hier ja da. :-)
Da du anscheinend den GCC benutzt, solltest du möglichst immer mit den switches -ansi -pedantic-errors übersetzen. Wenn das Programm dann kompiliert, ist es zumindest sprachlich korrekt.
-
12.02.2010, 19:38 #16
[C] AW: Stringlänge im Puffer zurückgeben
aus der strlen.h:
size_t strlen(const char *str);
damit kann man ganz einfach die Stringlänge ermitteln.GA870A-UD3, 2x2GB RAM, OCZ Vertex2E60,
X6 1055T + Scythe Mugen B,
Palit GTX 275 + Scythe Kama Stay + 2x Scythe Slip Stream,
Enermax Liberty 400W @ max. 520W + BeQuiet Silent Wings USC,
CM690II+, W7pro
ultra silent

Zitieren
