Schrift
[thread]1122[/thread]

Probleme mit strcat



<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
renee
 2005-04-28 14:28
#11109 #11109
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich bin nicht so firm in C/C++

folgender Code erzeugt einen Segmentation fault. Was muss ich ändern?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int test(){
char *multi = "";
int i;
for(i = 0; i < 10; i++){
char *title = "test ";
strcat(multi,title);
}
fprintf(stderr,"%s\n",multi);
return 0;
}

int main(){
test();
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2005-04-28 14:52
#11110 #11110
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Lösung: Das Problem besteht wieder darin, dass der Speicher für das verkettete Ergebnis nicht belegt wurde. C kennt keinen automatisch verwalteten String-Typ. C Compiler belegen nur dann Speicher für Objekte, wenn diese ausdrücklich im Quelltext enthalten sind (im Falle von Strings trifft dies auf String-Literale und character-Felder zu).

Aber was mach' ich, wenn ich wirklich nicht sagen kann, wie lang der String wird?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
GwenDragon
 2005-04-28 15:10
#11111 #11111
User since
2005-01-17
14510 Artikel
Admin1
[Homepage]
user image
[quote=renee,28.04.2005, 12:52]Aber was mach' ich, wenn ich wirklich nicht sagen kann, wie lang der String wird?
[/quote]
1. Bereitstellung von Speicher für Strings etc.
malloc() benutzen!

2. Wie du weißt nicht, wie lang der String werden kann?
Du hast doch die Länge des ersten Strings und die länge des anzuhängenden.
Stichwort strlen() !\n\n

<!--EDIT|GwenDragon|1114686689-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

renee
 2005-04-28 15:13
#11112 #11112
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
In dem Programm werden Nodes vom SOMs gelabelt und ich weiß nicht, wieviel Labels für ein Node sind und wie lang die einzelnen Labels sind... Rein theoretisch könnte es ein Node sein mit x-tausend Labels, wobei die Namen ja frei wählbar sind. Und manche User verwenden bestimmt ganzlangenamendamitdienodesauchunterschiedenwerdenkönnenauchnachzweihundertjahren ;)

edit: malloc() schaue ich mir mal an, danke, dann kann ich auch was mit strlen() machen, aber nur in Verbindung mit strcat bringt mir strlen() nichts (wenn ich es einfach so in den Code von meinem ersten Post einbaue...)!\n\n

<!--EDIT|renee|1114686924-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
betterworld
 2005-04-28 23:23
#11113 #11113
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Wenn Du am Anfang noch nicht weisst, wie lang der String werden wird, hilft auch malloc nicht viel. Aber mithilfe von realloc solltest Du das Problem loesen koennen, auch wenn es unter Umständen nicht sehr effizient ist.
esskar
 2005-04-28 23:31
#11114 #11114
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=betterworld,28.04.2005, 21:23]Aber mithilfe von realloc solltest Du das Problem loesen koennen, auch wenn es unter Umständen nicht sehr effizient ist.[/quote]
die Ausgage sollten wir mal in Anführungszeichen setzten!


Abhilfe: STL

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <string> // nicht string.h
#include <stdio.h>
#include <stdlib.h>


int test(){
std::string multi = "";
int i;
for(i = 0; i < 10; i++){
  char *title = "test ";
  multi += title;
}
fprintf(stderr,"%s\n",multi.c_str());
return 0;
}

int main(){
return test();
}


die STL verlangt aber einen C++ Kompiler; nicht C\n\n

<!--EDIT|esskar|1114716712-->
Dubu
 2005-04-28 23:47
#11115 #11115
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Dannn wuerde ich aber auch C++-artiger programmieren. :)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <string>
#include <iostream>

using namespace std;

int test() {
   string multi = "";
   for(int i = 0; i < 10; i++){
       char *title = "test ";
       multi += title;
   }
   cerr << multi << endl;
   return 0;
}

int main() {
   return test();
}
\n\n

<!--EDIT|Dubu|1114717759-->
betterworld
 2005-04-28 23:49
#11116 #11116
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
esskar: Igitt, C++ ;-)

Aber um endgueltig den Spaß zu verderben: Wie wäre es denn hiermit?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int test(){
int i;
for(i = 0; i < 10; i++){
char *title = "test ";
fputs(title, stderr);
}
fputs("\n", stderr);
return 0;
}

int main(){
test();
}

Aber ich fürchte, das ist nicht das, was Du möchtest\n\n

<!--EDIT|betterworld|1114717843-->
murphy
 2005-04-29 02:01
#11117 #11117
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Für kompliziertere Stringoperationen sollte man sich mal sprintf ansehen. Das bietet auch die Möglichkeit, die Länge des Resultates festzustellen, bevor man es irgendwohin speichert.
When C++ is your hammer, every problem looks like your thumb.
esskar
 2005-04-29 02:37
#11118 #11118
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Dubu,28.04.2005, 21:47]Dannn wuerde ich aber auch C++-artiger programmieren. :)[/quote]
Hmm; ich ziehe die printf Familie der steam Familie vor. :)

Code: (dl )
using namespace std;


ist bei so kleinen Sachen okay; ansonsten versaut man sich ja nur den Namespace. Aber das finde ich an namespaces ja gerade so schön, dass alles gekappselt bleibt!
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2005-04-28 14:28.