Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » cpp

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 <
000
02.11.2003, 02:41 Uhr
~Sidejoe
Gast


Hallo Leute
wir versuchen grad nen cpp programm zu schreiben und haben nen paar probleme bei dennen wir hilfe bräuchten. im folgenden source ist irgend wo nen fehler aber wir können ihn net finden, bitte helft uns:


C++:
int Bilder(){
    char Pfad[101];
    char jein;
    char alternativ[105];
    char jeinhoeheundbreite;
    char h[22];
    char b[20];
    int x;
    printf("Geben sie den Pfad zu den Bildern an (100 Zeichen maximal):\n");
    scanf("%s",&Pfad);
    printf("Soll ein alternativer Text fuer nichtgeladene Bilder angezeigt werden?\n");
    do{
        x=0;
        printf("J/N?\n");
        cin >> jein;
        switch(jein){
                case'j':
                case'J':alternativ[0]='a';alternativ[1]='l';alternativ[2]='t';alternativ[3]='=';
                        printf("Geben Sie den alternativen Text ein(100 Zeichen Maximal):\n");
                        scanf("%s",&alternativ[4]);break;
                case'n':
                case'N':alternativ[0]=' ';break;
                default:x=1;continue;}  
        printf("Sollen Hoehen- und Breitenangaben gemacht werden?\n");
        printf("J/N?\n");
        cin >> jeinhoeheundbreite;
        switch(jeinhoeheundbreite){
                case'j':
                case'J':h[0]='h';h[1]='e';h[2]='i';h[3]='g';h[4]='t';h[5]='h';h[6]='=';b[0]='w';b[1]='i';b[2]='d';b[3]='t';b[4]='h';b[5]='=';                
                        printf("Geben Sie die Hoehe in Pixeln an:\n");
                        scanf("%s",&h[7]);
                        printf("Geben Sie die Breite in Pixeln an:\n");
                        scanf("%s",&b[6]);break;
                case'n':
                case'N':h[0]=' ';b[0]=' ';break;
                default:x=1;continue;}        
    }while(x!=0);                              
    
    
    printf("\n<img src=\"%s\" %s %s %s>",Pfad,alternativ,h,b);            
}  


Das problem ist das im falle das n oder N bei alternativem Text gewählt wird, in der Ausgabe auf dem Bildschirm fehler auftauchen, im gegensatz zur frage nach Höhe und Breite.Dort wird einfach ein leerzeichen geschrieben.Also was machen wir falsch? : )

und hatt irgend jemand ahnung davon ob es eine funktion gibt mit der man etwas in denn zwischen speicher schreiben kann?? thx jetzt schon mal

gruss sidejoe&kn_

--edit: Pablo: smiles deaktiviert --

Dieser Post wurde am 02.11.2003 um 03:25 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.11.2003, 03:37 Uhr
Pablo
Supertux
(Operator)


Was für ne Mischung C/C++! Du solltest entweder C oder C++ programmieren aber nicht beide gleichzeitig.

So on the fly:

C++:
scanf("%s",&Pfad);


Ich weiß nicht, ob & viel ausmacht, aber ohne & geht auch. Aber wenn ihr C++ programmieren wollt, wieso nimmt ihr nur an manchen Stellen std::cin >> und an anderen scanf ? Ich würde an euren Stelle std::cin >> nehmen.


C++:
case'J':alternativ[0]='a';alternativ[1]='l';alternativ[2]='t';alternativ[3]='=';
                        printf("Geben Sie den alternativen Text ein(100 Zeichen Maximal):\n");
                        scanf("%s",&alternativ[4]);break;


Ich würde strcpy und strcat nehmen. (Angenommen gäbe es char temp[105])

C++:
strcpy(alternativ, "alt=");
std::cout << "Geben Sie den alternativen Text ein(100 Zeichen Maximal):\n";
std::cin >> temp;
strcat(alternativ, temp);



Bei

C++:
case'J':h[0]='h';h[1]='e';h[2]='i';h[3]='g';h[4]='t';h[5]='h';h[6]='=';b[0]='w';b[1]='i';b[2]='d';b[3]='t';b[4]='h';b[5]='=';                
                        printf("Geben Sie die Hoehe in Pixeln an:\n");
                        scanf("%s",&h[7]);
                        printf("Geben Sie die Breite in Pixeln an:\n");
                        scanf("%s",&b[6]);break;



ebenfalls. Benutze strcpy und strcat, es ist sicherer, und brauchst du wenig Code. Aber wenn ihr C++ schreibt, wieso habt ihr nicht string statt char[] genommen?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 02.11.2003 um 03:39 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.11.2003, 09:39 Uhr
ao

(Operator)



C++:
alternativ[0] = ' ';


ist nicht der richtige Weg, um einen String auf "Leerstring" zu setzen. In C und C++ ist es Konvention, dass Strings mit einem Null-Zeichen ('\0') abgeschlossen werden ("Null-terminierte Strings"). Ihr müsst also

C++:
alternativ[0] = '\0';


schreiben. alternativ[0] = 0; tut es auch. Oder benutzt, wie Pablo vorgeschlagen hat, die String-Funktionen aus der C-Runtime-Lib. Da muss man zwar zuerst ein bisschen drüber nachlesen, aber es ist immer besser, fertige Routinen zu benutzen als das Rad immer wieder neu zu erfinden.

Die Art, wie ihr "height=" und "width=" vorbelegt, ist (vorsichtig ausgedrückt) gewöhnungsbedürftig. Ihr macht es unnötig kompliziert. Dringender Rat: Lernt, mit den Bibliotheksfunktionen umzugehen.

Dass das mit der Höhen- und Breitenangabe funktioniert hat und mit dem Alternativtext nicht, kann blanker Zufall sein. Ihr habt den Speicher nicht initialisiert, also steht da irgendwas drin, was irgendwer vorher reingemalt hat.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.11.2003, 16:35 Uhr
~sidejoe
Gast


Guten Morgen, also zuerst mal trotzdem danke für die antworten.
Warum an mancher stelle scanf und nicht cin ? In der vergangenheit sind wir leider immer wieder über fehlerhafte Ausgaben gestolpert,in Verbindung mit cin und char[].Deswegen sind wir teilw. auf scanf umgestiegen.
Das mit der Null-terminierung war mir nicht bewusst,danke dafür.Mittlerweile ist der Code abgeändert wie Pablo es vorgeschlagen hat, mit strcpy und strcat... wobei ich das Gefühl nicht loswerde das wir es falsch verwenden:

C++:
switch(jeinhoeheundbreite){
                case'j':
                case'J':strcpy(temph, " heigt=\"");strcpy(tempb, " width=\"");                
                        printf("Geben Sie die Hoehe in Pixeln an:\n");
                        cin >> h;
                        printf("Geben Sie die Breite in Pixeln an:\n");
                        cin >> b;
                        strcpy(mistzeichen2,"\"");
                        strcpy(mistzeichen3,"\"");
                        strcat(temph,h);
                        strcat(tempb,b);
                        strcat(endergebniss,temph);
                        strcat(endergebniss,mistzeichen2);
                        strcat(endergebniss,tempb);
                        strcat(endergebniss,mistzeichen3);break;
                case'n':
                case'N':break;      


ein bischen arg Umständlich oder?
Nur noch die eine Frage am Rande, gibt es eine funktion mit der in den zwischenspeicher gschrieben werden kann?
danke schon mal.kn_&sidejoe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.11.2003, 16:47 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


meinst du sprintf?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.11.2003, 17:04 Uhr
~side-joe
Gast


Weiss nicht, sprintf sagt mir nicht wirklich was.Ziel ist es das, dass was ich bisher auf den Bildschirm ausgeben lass, letztendlich im Zwischenspeicher steht und man es per strg +v in bspw. einem editor einfügen lassen kann.Gruß kn_
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.11.2003, 20:10 Uhr
Pablo
Supertux
(Operator)



Zitat:
~sidejoe postete
wobei ich das Gefühl nicht loswerde das wir es falsch verwenden:



Natürlich, ihr mischt C und C++ und das sollte man nicht tun, am besten wäre alles mit strings und die Funktionen von der STL benutzen, das macht die Sachen um einieges einfacher. Ich bin leider kein C++ Experte, deshalb benutze ich nur C, aber mischen tue ich nicht.


C++:
int sprintf(char *str, const char *format, ...);



Sprintf macht im Prinzip dasselbe, was printf macht. Printf gibt in stdout (Bildschirm bei den meisten Rechnern) das aus, was man in const char* format übergibt. Da man auch Werte der Variablen mitgeben will, kann man diese Zeichenkette formatieren, z.b %d bedeutet dass da eine int Variable ausgegeben werden muss, und nach der Übergabe der Zeichenkette mit dem Format kommen die anderen Variablen, z.b:

C++:
int z=9;
printf("Hallo, World. Das ist mein Format und hier %d kommt eine Zahl.\n", z);


Die Ausgabe ist: Hallo, World. Das ist mein Format und hier 9 kommt eine Zahl

Nun, stell dir vor, ich will dasselbe ausgeben, aber nicht in stdout sondern in eine andere Variable von Typ char* bzw. char[]m dann nehme ich spriintf


C++:
char kette[255];
int z=9;
sprintf(kette, "Hallo, World. Das ist mein Format und hier %d kommt eine Zahl.\n", z);


Dann speichert kette die Zeichenkette: Hallo, World. Das ist mein Format und hier 9 kommt eine Zahl.

Wenn die Zeichenkette von Format größer als die Zeichenkette von kette, dann kann sein, dass du eine Segmentation Fault kriegst und das Programm beendet. Ich habe dieses Problem nie gehabt, weil ich mich darm gekümmrt hab, dass ich genügend Platz für die Zeichenkette habe.


Bearbeitung:


Zitat:


C++:
case'J':strcpy(temph, " heigt=\"");strcpy(tempb, " width=\"");                
                        printf("Geben Sie die Hoehe in Pixeln ann");
                        cin >> h;
                        printf("Geben Sie die Breite in Pixeln ann");
                        cin >> b;
                        strcpy(mistzeichen2,"\"");
                        strcpy(mistzeichen3,"\"");
                        strcat(temph,h);
                        strcat(tempb,b);
                        strcat(endergebniss,temph);
                        strcat(endergebniss,mistzeichen2);
                        strcat(endergebniss,tempb);
                        strcat(endergebniss,mistzeichen3);break;




Ich würde das zum Beispiel so machen:

C++:
// angenommen: ich habe 2 Variablen befehel, bild
// von typ: char befehl[4096], char bild[4096]; 2 Variabelen von typ int names height und width
printf("Geben Sie den Pfad der Datei an: ");
scanf("%s", bild);
printf("Geben Sie die Höhe in Pixeln an: ");
scanf("%d", &height);
printf("Geben Sie die Breite in Pixeln an: ");
scanf("%d", &width);
// hier überprüfe nicht nach der Länge, ich setzte voraus, es gäbe genügend Platz.
sprintf(befehl, "<img src=\"%s\" width=\"%d\" height=\"%d\">", bild, height, width);


Das ist meiner Meinung nach viel kompakter, lesbar und "fehlerfrei", ich habe eigentlich mich nicht um die Länge gekümmert, usw. d.h., wenn die Länge des Pfaades extrem lang, mehr als 4090 Zeichen lang ist, dann passiert Mist, usw.... deshlab "fehlerfrei", aber kompakter und lesbarer.


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 03.11.2003 um 20:20 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.11.2003, 20:20 Uhr
0xdeadbeef
Gott
(Operator)


Das ist eines der Hauptprobleme von sprintf, scanf usw; du hast keinen wirklichen Schutz gegen segfaults. Wenn du C++ benutzt, ist das hier die sicherste Möglichkeit:

C++:
#include <string>
#include <iostream>
#include <sstream>

//...

std::string s;
std::stringstream sout;
int x = 9;

sout << "Hello, World! Hier: " << x << " steht eine Zahl";
s = sout.str();


Die Klasse std::stringstream übernimmt das Buffering für dich, deswegen hast du keine Overflows zu erwarten (Es sei denn, dein String ist länger als der verfügbare Speicher, aber das kommt so gut wie nicht vor, und du hast dasselbe Problem in C auch). Außerdem kannst du noch ne ganze Menge anderen krassen Kram damit machen - Iteratoren zum Beispiel, aber das jetzt zu erklären, würde mir zu lange dauern. Schau mal auf www.gnuenterprise.org/doc/stl-manual/html/ und www.cplusplus.com/ref/iostream vorbei, das eine ist ein gutes Handbuch für die STL, das andere eine gute Referenz für die Stream-Bibliothek.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: