Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » & (Adreßoperator)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] [ 3 ] [ 4 ] > 5 < [ 6 ] [ 7 ] [ 8 ]
040
19.08.2006, 21:39 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von ~chessy:
vielen dank ihr deppen.

Bitte.Schön dass du in der Tasche fündig geworden bist!
Dann weißt du ja jetzt dass der Rückgabewert von scanf dein IQ,abhängig von deiner Tagesverfassung,ist.

--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
041
19.08.2006, 22:48 Uhr
kronos
Quotenfisch
(Operator)


Seid doch nett zu einander.

@Spacelord: Mach du erstmal dein Jodeldiplom!
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
042
21.08.2006, 10:49 Uhr
0xdeadbeef
Gott
(Operator)


Jetzt kommt doch alle mal wieder runter.

Also, der Reihe nach:

1.

C++:
void main(void);


war nie Standard und wird es aller Voraussicht nach auch nie sein, weder in C, noch in C++.

2. Beim einlesen eines Strings ist kein Adressoperator nötig, weil der String implizit in einen char-Pointer konvertibel ist. Code-Beispiel:

C++:
#include <stdio.h>

void foo(char *s) { s[1] = 'a'; }

int main(void) {
  char bar[] = "Hello";

  foo(bar); // Implizite Umwandlung von char[] nach char*
  puts(bar);

  return 0;
}



3. Der Rückgabewert von scanf ist die Anzahl der eingelesenen Parameter. Das wird benötigt, um Bogus-Eingaben abzufangen, z.B. wenn du zwei Zahlen erwartest und der User "eins zwei" eingibt.

C++:
#include <stdio.h>
#include <errno.h>

int main(void) {
  int x, y, check;

  printf("Zwei Zahlen eingeben: ");
  check = scanf("%d %d", &x, &y);

  if(check == 2) {
    printf("%d + %d = %d\n", x, y, x + y);
  } else {
    printf("Es wurde(n) nur %d Zahl(en) erkannt.\n", check);
    return EINVAL;
  }

  return 0;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
043
21.08.2006, 16:44 Uhr
~chessymaster
Gast



C++:
#include <stdio.h>

int main (void)
{
    long i = 0;
    long x =0;
    char name[4];

        printf ("Geben Sie ein Wort ein: \n");
        scanf ("%s", name);

        for (i=0;i<name[x];i++)
        {
            x++;    
        }
        
        printf ("Ihr Wort hat %ld Buchstaben: \n", x);
        printf ("Ihr Wort lautet: %s \n", name);

    return 0;
}


Kann ich noch mal nerven?
Habe ein Arry mit 4 Feldern deklariert. Wenn ich aber das Wort "boote" eingebe,
erscheint dies auch im Ausgabestring. Dürften normalerwesie nur "boot" ausgegeben werden?


Bearbeitung von 0xdeadbeef:

cpp-tags - mal wieder


Dieser Post wurde am 21.08.2006 um 17:32 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
044
21.08.2006, 16:53 Uhr
Tommix



Hallo,

Zitat von ~chessymaster:
Habe ein Arry mit 4 Feldern deklariert.

Das weiß scanf nicht und schreibt den Rest wild in den Speicher.

C++:
scanf ("%3s", name); // nr 4 ist für das abschließende \0 reserviert!



Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
045
21.08.2006, 16:56 Uhr
~Blubber2063
Gast


Nein es dürfte sogar nur Boo darstellen, da du die abschließende 0 vergessen hast, allerdings schreibt scanf solange auf die Daten bis alles gelesen ist da du es nicht beschränkt hast wieviel Zeichen Scanf lesen darf. Du schreibst damit in Speicher der anscheinend zufälliger Weise noch dir gehört sonst würdest du nen Segfault kriegen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
046
21.08.2006, 17:36 Uhr
0xdeadbeef
Gott
(Operator)


Joa, stack smashing vom Feinsten. Aber zur Erklärung:

Der Hintergrund ist der, dass beim Aufruf von scanf das char-Array implizit in einen char-Pointer gewandelt wird, die aufgerufene Funktion also keine Ahnung hat, wie lang der dahinterliegende Buffer tatsächlich ist. Deswegen musst du das im Format-String mit angeben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
047
23.08.2006, 13:40 Uhr
~chessymaster
Gast


hi, der mega noob in c++ hat mal wieder eine frage:
hier erst ma mein proggy.


C++:



#include <stdio.h>
#include <stdlib.h>

int main (void)
{

char name[4];


printf ("Geben Sie ein Wort ein: \n");
fgets(name, 9, stdin);

printf ("Ihr Wort: %s \n", name);

return 0;
}


C++:



entsteht hier ein pufferüberlauf? der array-bereich von 4 feldern wird ja überschritten.
fgets lässt 8zeichen + stringende zu.

gebe ich hausbaugesellschaft ein, erscheint hausbaug. das is ja auch ok, aber da mein arry nur 4 felder hat, werden die anderen zeichen ja wild in den nachfolgenden speicherfeldern geschrieben, dadurch werden doch sicher andere daten überschrieben.

es findet eine bereichsüberschreitung statt; pufferüberlauf. korrekt? fgets verhindert doch aber diesen pufferüberlauf, stimmts?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
048
23.08.2006, 13:42 Uhr
~chessymaster
Gast



C++:
// #include <stdio.h>
#include <stdlib.h>

int main (void)
{

char name[4];


printf ("Geben Sie ein Wort ein: \n");
fgets(name, 9, stdin);

printf ("Ihr Wort: %s \n", name);

return 0;
}


so jetzt aber die tags
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
049
23.08.2006, 14:33 Uhr
0xdeadbeef
Gott
(Operator)


fgets verhindert nicht auf magische Weise einen Pufferüberlauf, sondern verhindert lediglich, dass mehr als die angegebene Anzahl Zeichen - in diesem Fall 9 - and die angegebene Stelle im Speicher - in diesem Fall name - geschrieben wird. Wenn da - wie in diesem Fall - nicht genug Platz für die neun Zeichen ist, gibt es einen Pufferüberlauf.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] [ 3 ] [ 4 ] > 5 < [ 6 ] [ 7 ] [ 8 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: