Forum: Compiler & IDEs String: Char anhängen, vergleichen und löschen ?


von Marc M. (macmek)


Lesenswert?

Ich definiere den String und den Char:
uint8_t Text[30]={};
uint8_t Buchstabe='A';

Soweit klappt alles.

Ich möchte ihm Buchstaben anhängen:
strcat(Text, Buchstabe);

Dann will ich den String vergleichen:
if (strcmp(Text,"ABC") ) { ... }

Zuletzt soll der String gelöscht werden:
Text=NULL;

Dann stimmt was nicht:
In function 'main':
warning: passing argument 1 of 'strcat' discards qualifiers from
pointer target type
warning: passing argument 2 of 'strcat' makes pointer from integer
without a cast
warning: passing argument 1 of 'strcmp' discards qualifiers from
pointer target type
warning: comparison of distinct pointer types lacks a cast
warning: comparison of distinct pointer types lacks a cast
error: incompatible types in assignment

Was mache ich falsch ?

von Die meisten Elche (Gast)


Lesenswert?

Warum verwendest Du den Datentyp uint8_t anstelle von char?
strcat hängt einen String an einen anderen an.
Du aber übergibst ein einzelnes Zeichen.

Desweiteren versuchst Du beim Löschen des Strings dem Array einen
Nullpointer zuzuweisen.
Es genügt aber, in das erste Zeichen des Arrays ein Null-Zeichen
einzutragen.

Versuchs mal hiermit:

  char Text[30] = "\0";
  char Buchstabe[2] = "A";

  strcat(Text, Buchstabe);

  if (!strcmp(Text, "ABC"))
  {
  // .. gleich
  }

  Text[0] = '\0';


Und sieh Dir ganz genau an, wie ich die Variable "Buchstabe"
deklariert habe.

Und denke darüber nach, was passiert, wenn der String Text bereits 29
Zeichen enthält und strcat aufgerufen wird ...

von Marc M. (macmek)


Lesenswert?

uint8_t habe ich aus einem Beispiel übernommen, ist nun char oder int.

Vielen Dank, das Löschen klappt super.

Doch ich habe Probleme mit den Typenumwandlungen, eigentlich sollte
"char" und "Array of char" doch wunderbar zusammenpassen.
"warning: passing argument 1 of 'strcat' discards qualifiers from
pointer target type"


Nach
char Buchstabe[2]="\0";
Buchstabe[2] = "A";
strcat(Text, Buchstabe);
besteht Text nur aus dem letzen Buchstaben, es wird nur überschrieben,
aber nicht angehängt ?

Alternativ versuchte ich:
int i=0;
i = strlen(Text)+1;
Text[i]=Buchstabe;
was aber gar nicht geht. (An die 0 habe ich gedacht, aber auch mit +2
geht es nicht.)

von Rolf Magnus (Gast)


Lesenswert?

> In function 'main':
> warning: passing argument 1 of 'strcat' discards qualifiers from
> pointer target type

Die Fehlermeldung ergibt eigentlich keinen Sinn, denn deine Variable
Text hat keine "qualifiers", die ignoriert werden könnten. Bist du
sicher, daß die wirklich so definiert ist?

> warning: passing argument 2 of 'strcat' makes pointer from integer
> without a cast

strcat erwartet zwei Zeiger auf Strings. Du übergibst ihm aber einen
Zeiger und ein einzelnes Zeichen. Dies konvertiert er in einen Zeiger.
Dein 'A' wird also als Adresse interpretiert.

> warning: passing argument 1 of 'strcmp' discards qualifiers from
> pointer target type

Auch hier ist die Meldung wieder seltsam.

> warning: comparison of distinct pointer types lacks a cast
> warning: comparison of distinct pointer types lacks a cast

Das wird vermutlich daran liegen, daß du uint8_t statt char für Zeichen
verwendest.

> error: incompatible types in assignment

Text ist ein Array. Dem NULL zuzuweisen ergibt keinen Sinn. Was meinst
du oben mit "soll der String gelöscht werden?"

von Rolf Magnus (Gast)


Lesenswert?

Hmm, war ich wieder zu langsam.

> Nach
> char Buchstabe[2]="\0";
> Buchstabe[2] = "A";

Böser Fehler. Du erzeugst ein Array aus char, das zwei Elemente
aufnehmen kann, eins mit Index 0 und eins mit Index 1. Dann versuchst
du, an Index 2 zu schreiben, also in den Speicher, der hinter dem Array
liegt und zu irgendwas anderem gehört, das dadurch überschrieben wird.
"A" kannst du da auch nicht hinschreiben, sondern höchstens 'A'.
Mir scheint, daß du hier ziemlich wild rumstocherst, um eine
funktionierende Lösung zu finden. Du solltest dich mit den Grundlagen
von C erstmal vertraut machen. Trial/Error kann bei sowas ziemlich
lange dauern und wird nie ganz fehlerfrei.

> besteht Text nur aus dem letzen Buchstaben, es wird nur
> überschrieben, aber nicht angehängt ?

In deinem Beispielprogramm war der String leer, also wo soll was
angehängt werden?

> Alternativ versuchte ich:
> int i=0;
> i = strlen(Text)+1;
> Text[i]=Buchstabe;

Du schreibst hier hinter das \0 am Ende des Strings. strlen(Text) ist
die Länge des Strings. Text[strlen(Text)] ist das \0 nach dem letzten
Zeichen. Was du tun müßtest, wäre erst an Text[strlen(Text)] das neue
Zeichen zu schreiben, dann dahinter ein \0. Und vorher sichergehen,
daß das Array auch lang genug ist, um den ganzen Text aufzunehmen.

von Charles (Gast)


Lesenswert?

Also so schwer ist das doch gar nicht:

#include ....//was man so braucht
#include <string.h> //für memset

int main(void)
{


char Text_String[30]={};
char Buchstabe='A';
char temp_buffer[2];

//char to string
sprintf(temp_buffer,"%c",Buchstabe);

strcat (Text_String,temp_buffer);

//löschen
memset(&Text_String,0,sizeof(Text_String));


return 0;
}

von Karl heinz B. (kbucheg)


Lesenswert?

> sprintf(temp_buffer,"%c",Buchstabe);

Wow. Das ist aber mächtig mit Kanonen auf Spatzen
schiessen.

von Marc M. (macmek)


Lesenswert?

Juhu, memset war der Befehl den ich suchte und weg mit dem +1 !
(memset muss 2x laufen, nur dann klappt es immer, na ja)

Ähm, die Grundlagen fehlen nicht, ich habe nur den klassischen "um
eins daneben"-Fehler gemacht und sollte nicht mehr so spät in der
Nacht programmieren ;-)

Vielen Dank an alle !

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> (memset muss 2x laufen, nur dann klappt es immer, na ja)

Dann such' bitte deinen Bug.  memset() dürfte vom Compiler
sogar inline realisiert werden, sofern du optimierst und
nicht gerade -ffreestanding als Compileroption benutzt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.