C Stringlänge im Puffer zurückgeben

foggy80

Lt. Commander
Registriert
Juli 2008
Beiträge
1.034
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.

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

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:
Line|3|:warning: initialization makes integer from pointer without a cast|
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...
 
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.
 
foggy80 schrieb:
Jetzt funktioniert's, Danke =)

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!

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

Stell Dich schon einmal auf eine Zugriffsverletzung ein, wenn <key> nicht in <puffer> vorkommt!
 
Zuletzt bearbeitet:
Im Endeffekt wollte ich die ganze Sache nach einem '\0' Suchen lassen.

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

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.
 
Zuletzt bearbeitet:
foggy80 schrieb:
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.
funktioniert auch, aber ich würde es dir nicht empfehlen. was passiert wirst du dir ja denken können. dazu kannst du dir mal funktionen wie strncat ansehen, denn diese arbeiten jeweils ohne irgendwo ein \0 reinzuschieben oder anzuhängen.
 
claW. schrieb:
funktioniert auch, aber ich würde es dir nicht empfehlen. was passiert wirst du dir ja denken können. dazu kannst du dir mal funktionen wie strncat ansehen, denn diese arbeiten jeweils ohne irgendwo ein \0 reinzuschieben oder anzuhängen.

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

also bei mir funktionierts.
 
Zuletzt bearbeitet:
code:
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;
}
ausgabe:
Code:
abc╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠&
úx©*↕def
Drücken Sie eine beliebige Taste . . .
 
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;
}
verstehst du das jetzt besser?
 
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.
 
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.
 
foggy80 schrieb:
Die Fehlermeldung würde mich auch garnicht stören wenn das Programm laufen würde...
*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.
 
Zurück
Oben