Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]1135[/thread]

Ganze Zeile einlesen incl. Leerzeichen: ANSI C



<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
format_c
 2005-11-17 14:27
#11272 #11272
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hi,
ich hab schon im forum gesucht nicht das gefunden was ich suche.

Ich lese momentan meine ganze Zeile mit
Code: (dl )
1
2
char * pstr[255];
gets(pstr);

ein.

Funktioniert auch soweit so gut. Jetzt meldet mir allerdings mein kompiler, dass diese Funktion unsicher sei und ich nicht verwenden solle. gibt es in C Eine Alternative? Nicht cin.getline.

Gruß Alex
esskar
 2005-11-17 16:25
#11273 #11273
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char *getsn(char *buffer, int size) {
     char c;
     char *ptr = buffer;

     while(size > 1 && ptr != NULL && (c = getchar()) != '\n') {
          if(c == EOF) { ptr = NULL; }
          else { *ptr++ = c; --size; }          
     }
if(ptr != NULL) {
*ptr = 0;
ptr = buffer;
}
     return ptr;
}
\n\n

<!--EDIT|esskar|1132237723-->
format_c
 2005-11-17 22:41
#11274 #11274
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Natürlich ist die Devise selbst basteln. werde mir die funktion mit in meine header datei für nützliche string tools packen.

Danke

Gruß Alex
betterworld
 2005-11-17 22:54
#11275 #11275
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Dass gets unsicher ist, liegt daran, dass gets nicht weiss, wie lang der Puffer ist, und daher leicht einen Stack-/Heap-Overflow bauen kann. Alternativen:
1.
Code: (dl )
1
2
       #include <stdio.h>
char *fgets(char *s, int size, FILE *stream);

2. Mit scanf kann man sich auch etwas basteln, was den Anspruegen genuegt
esskar
 2005-11-17 23:46
#11276 #11276
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=format_c,17.11.2005, 21:41]Natürlich ist die Devise selbst basteln. werde mir die funktion mit in meine header datei für nützliche string tools packen.

Danke

Gruß Alex[/quote]
aber doch nie die signatur, oder?
denn den code hast du in der dazugehörigen .c datei, oder?
format_c
 2005-11-18 01:39
#11277 #11277
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Code kann man doch auch in Header Dateien packen. Klar sollten da nur die Deklarationen und Prototypen stehen aber das ist doch bei ANSI C nicht so wild oder?

BTW kennst du schon www.tntnet.org??

Gruß Alex
esskar
 2005-11-18 02:03
#11278 #11278
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=format_c,18.11.2005, 00:39]Code kann man doch auch in Header Dateien packen. Klar sollten da nur die Deklarationen und Prototypen stehen aber das ist doch bei ANSI C nicht so wild oder?[/quote]

Hmm, wenn du es in ein anders project einbindest, muss wieder neu kompiliert werden; anders würde ein linken der obj oder lib schon reichen

[quote=format_c,18.11.2005, 00:39]BTW kennst du schon www.tntnet.org??[/quote]

Sieht interessant aus.
format_c
 2005-11-18 17:29
#11279 #11279
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hab jetzt hier ein anderes problem.
ich habe ein char ** woerter Ein Array von Char Pointern. In einer Sortierfunktion möchte ich jetzt woerter[x] mit woerter[y]tauschen.
Also eigentlich will ich nur die Char Pointer tauschen nicht die zeichenketten.

Ich versuche das mit
Code: (dl )
1
2
3
char * temp = woerter[x];
woerter[x]=woerter[y];
woerter[y]=temp;


jedoch bekomme ich eine Warnung wenn zum ersten mal char * temp aufgerufen wird.

Dann hab ich es mit new probiert...
Wenn ich es mit
Code: (dl )
1
2
3
4
char * temp = new char [strlen(woerter[x])];
temp=woerter[x];
woerter[x]=woerter[y];
woerter[y]=temp;

Dann funktioniert es obwohl ich nicht weis ob noch doch die Zeichenkette kopiert wird.
Wenn ich allerdings dabei kein Speicherfresser erzeugen will und
Code: (dl )
1
2
3
4
5
char * temp = new char [strlen(woerter[x])];
temp=woerter[x];
woerter[x]=woerter[y];
woerter[y]=temp;
delete [] temp;

Bringt er mir auch einen Speicherfehler

Hier mein ganzer Veruchscode:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main() {
char * woerter[3];
woerter[0]="Das ist ein Test";
woerter[1]="Das ist ein Test2";
woerter[2]="Das ist ein TEs3";
char * temp = new char [strlen(woerter[1])];
temp=woerter[1];
woerter[1]=woerter[2];
woerter[2]=temp;
delete [] temp;
printf("%s\n",woerter[2]);
return 0;

}


Kann mir bitte jemand mit den Pointern helfen. Ich krieg das nicht in den Kopf rein. Wann weise ich dem wirklich eine neue Adresse zu und was brauche ich dafür. Normalerweise ist doch ein Pointer nur int lang. Dazu brauche ich doch normalerweise nicht die Länge der dahinter stehenden Daten zu wissen oder?

Gruß Alex\n\n

<!--EDIT|format_c|1132327871-->
esskar
 2005-11-18 18:43
#11280 #11280
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
klar

wenn du delete [] temp aufrufst, teigt temp ja nicht mehr auf den speicherbereich, denn du mit new angelegt hast, sondern auf woerter[x]

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main() {
char *woerter[3];
char *temp = NULL;

woerter[0]="Das ist ein Test";
woerter[1]="Das ist ein Test2";
woerter[2]="Das ist ein TEs3";

temp = woerter[1];
woerter[1] = woerter[2];
woerter[2] = temp;

printf("%s\n",woerter[2]);
return 0;
}


btw. new ist kein C, sondern C++

wenn du doch C++ benutzt, dann so

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <algorithm>

int main() {
char *woerter[3];
char *temp = NULL;

woerter[0]="Das ist ein Test";
woerter[1]="Das ist ein Test2";
woerter[2]="Das ist ein TEs3";

std::swap(woerter[1], woerter[2]);

printf("%s\n",woerter[2]);
return 0;
}
esskar
 2005-11-18 18:44
#11281 #11281
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
die frage ist eben, ob du alles als C kompilierst, oder als C++!
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2005-11-17 14:27.