mikrocontroller.net

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


Autor: Marc Mk (macmek)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Die meisten Elche (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Marc Mk (macmek)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?"

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Charles (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> sprintf(temp_buffer,"%c",Buchstabe);

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

Autor: Marc Mk (macmek)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.