Go Down

Topic: Verkettung von char Strings [] (Read 1 time) previous topic - next topic

Loui91

Jun 01, 2017, 02:51 pm Last Edit: Jun 03, 2017, 01:05 am by uwefed Reason: add CODE TAGs </>
Hallo Liebe Gemeinde,

Falls ich etwas nicht ganz regelkonform poste, bitte ich um Nachsicht , dies ist mein erster Post...

zum Thema: ich versuche gerade Strings zu verketten. Dies soll dazu dienen durch ein Touchdisplay den Dateinamen für eine .txt einzugeben, welche auf der SD-Karte abgespeichert wird. Die Verkettung soll das ".txt" schreiben am ende der Eingabe Übernehmen.

Hier mal mein Code & Fehlermeldung:

Code: [Select]
char saveBuffer[25];   // Hier steht die Eingabe des Users - die ide will hier die Limitation ...
char txtBuffer[]={'.','t','x','t'};
char verkettung[];
int j;
bool txt = false;
for (int i=0; i<22; i++)   // Hier soll geschaut werden ob ".txt" schon im Dateinamen steht
{          
    if (SaveBuffer[i]== txtBuffer[j])
    {
       j++;
     }
                           
    if(j==4)
     {
        txt = true;
        Serial.println(".txt schon im namen enthalten");
        j=0;
      }

  //====== Ab hier hab ich das Problem ======//

    if (i>=22 && txt==false)      
      {
       verkettung = SaveBuffer + txtBuffer ;
       Serial.print("SaveBuffer");Serial.println(SaveBuffer + txtBuffer );  / vorläufige Ausgabe
       }
}


///////////////////////////////// Fehlermeldung  ///////////////////////////////////
exit status 1
invalid operands of types 'char [25]' and 'char [4]' to binary 'operator+'
//////////////////////////////////////////////////////////////////////////////////////

Ja der code klingt komisch... habe ich aber von
https://www.arduino.cc/en/Tutorial/StringAdditionOperator

ebenso kann ich den string SaveBuffer nicht ohne [Limit] angeben...?

Vielleicht kann mir da jemand weiterhelfen =)

Whandall

Wenn noch kein ".txt" drin ist, hänge eins an:

Code: [Select]
char saveBuffer[25] = "user";
char txtBuffer[] = ".txt";

void setup() {
  Serial.begin(250000);
  if (!strstr(saveBuffer, txtBuffer)) {
    strcat(saveBuffer, txtBuffer);
  }
  Serial.println(saveBuffer);
}
void loop() {}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Whandall

Oder etwas RAM schonender (5 Byte weniger)

Code: [Select]
char saveBuffer[25] = "user";
const char txtBuffer[] PROGMEM = ".txt";

void setup() {
  Serial.begin(250000);
  if (!strstr_P(saveBuffer, txtBuffer)) {
    strcat_P(saveBuffer, txtBuffer);
  }
  Serial.println(saveBuffer);
}
void loop() {}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Loui91

Vielen Dank Whandall für die Schnelle Hilfe :)
habs hinbekommen.

Ist echt eine Elegante lösung :smiley-cool:

für mein verständnis hätte ich da noch fragen, was sind das für befehle? entstammen die einer String-library oder wie kann ich mir das vorstellen?
und welche bedeutung steht   "  _P" zu ?  


Whandall

#4
Jun 01, 2017, 03:54 pm Last Edit: Jun 01, 2017, 04:00 pm by Whandall
Das sind Funktionen aus der Standad C Library.

http://www.nongnu.org/avr-libc/

Die Varianten mit _P können mit Stringkonstanten aus dem Flash umgehen,
die ohne erwarten alle Parameter im RAM.

http://www.atmel.com/webdoc/AVRLibcReferenceManual/pgmspace.html
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Serenifly

Genauer hier:
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html

Das meiste davon sind normale C Funktionen die es genauso auch auf dem PC gibt. Das ist nichts AVR- oder gar Arduino-spezifisches.

Loui91

 
und wieder was gelernt :) Vielen Dank

Go Up