Forum: Mikrocontroller und Digitale Elektronik PSTR() und String zusammensetzten?


von hal (Gast)


Lesenswert?

Hallo,
im C-Code für einen Atmel Mega328P muss ich einen String auf einen 
PSTR() und einen String zu einen String zusammensetzten.

Gibt es dafür bereits eine elegante Prozedur?

Bisher mache ich das so ...
1
// ...
2
  // const char *data
3
  // const char text[6]
4
  // ...
5
  
6
  // Textlängen
7
  uint8_t count_data = string_len_P(data);
8
  uint8_t count_text = string_len(text);
9
  uint8_t count_str  = count_data + count_text;
10
  
11
  // String zusammensetzen
12
  char str[count_str+1];
13
  
14
  uint8_t cnt = 0;
15
  
16
  for(uint8_t i=0;i<count_data;i++)
17
  {
18
    str[cnt++] = pgm_read_byte(data++);
19
  }
20
  
21
  for(uint8_t i=0;i<count_text;i++)
22
  {
23
    str[cnt++] = text[i];
24
  }
25
  
26
  str[cnt] = '\0';
27
28
// ...
29
30
uint8_t string_len(const char *str)
31
{
32
  uint8_t i = 0, 
33
      j = 0;
34
  
35
  while(str[i++]!='\0')
36
  {
37
    j++;
38
  }
39
  
40
  return j;
41
}
42
43
uint8_t string_len_P(const char *data)
44
{
45
  uint8_t i = 0;
46
  
47
  while(pgm_read_byte(data++))
48
  {
49
    i++;
50
  }
51
  
52
  return i;
53
}

danke

Gruß
hal

von Stefan F. (Gast)


Lesenswert?

Vielleicht gefällt dir strcat() und strcat_P(), sowie strlen() und 
strlen_P(). Damit kannst du dir deine Hand-gedengelten for-Schleifen 
sparen.

https://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga1fd2a6e188f02599e5eeb17519f67f3e

https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#ga5c1bae2b20f7d5ec00411c6378b8ed70

In den beiden Dateien sind noch viele andere nützliche Funktionen für 
C-Strings.

von foobar (Gast)


Lesenswert?

Beim avr-glibc gibt es die _P-Funktionen für progmem-Strings 
(strlen/strlen_P, strcpy/strcpy_P, etc).  Bei den printf-Funktionen 
zusätzlich zum %s das %S für progmem-Strings.  Die einfachste Lösung 
dürfte:
1
sprintf(str, "%S%s", data, text)
sein.

Btw, verkneif dir sowas wie "char str[count_str+1];" mit berechnetem 
count.  Nimm ne feste Größe und stell sicher, dass das Ergebnis 
reinpasst.

von hal (Gast)


Lesenswert?

OK, alles klar ... danke.

1
  char str[20];
2
  
3
  strcpy_P(str, data);
4
  strcat(str, text);
5
  
6
  uint8_t count = strlen(str);

foobar schrieb:
> Btw, verkneif dir sowas wie "char str[count_str+1];" mit berechnetem
> count.  Nimm ne feste Größe und stell sicher, dass das Ergebnis
> reinpasst.

Was ist der Nachteil?

von foobar (Gast)


Lesenswert?

> Was ist der Nachteil?

Ist, als würdest du dir beim Autofahren den Sicherheitsgurt auf's 
T-Shirt malen statt ihn anzulegen - sieht nett aus, hilft im Ernstfall 
(zu großer count) aber nicht.  Ändert nur den Namen: aus Buffer- wird 
Stack-Overflow.

Du kommst nicht drumherum, dir Gedanken zu machen, welche Größe maximal 
erlaubt/möglich ist und das entsprechend zu behandeln.

Bei erfahreneren Programmierern wirst du dieses Konstrukt nur sehr 
selten finden - insb nicht auf Systemen mit kleinem festen Stack.

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.