[programmazione] substring

E' sicuramente una domanda molto stupida,
ma come posso avere l'effetto substring che esiste in quasi tutti i linguaggi, in c?

mi spiego su arduino ho una stringa di questo tipo "CIAOMICHIAMOARDUINO"

e io vorrei avere qualcosa del tipo

substring(stringa,10,8) che mi restituisce MOARDUIN

cosa mi consigliate?

grazie

ciao

devi imparare come funziona la libreria string che includi come string.h

ci sono una tonnellata di funzioni :slight_smile:

m

grazie massimo, ma c’è qualcosa che non mi torna,

ho questa funzione

char *substring(size_t start, size_t stop, const char *src, char *dst, size_t size)
{
int count = stop - start;
if ( count >= --size )
{
count = size;
}
sprintf(dst, “%.*s”, count, src + start);
return dst;
}

In un dato punto del programma ho la stringa da spezzettare che si chiama strbuf.

(giusto per dare maggiori informazioni se faccio un atoi(strbuf) questa restituisce esattamente 123456789)

Ora creo le 3 stringhe di destinazione in questo modo:

char a[3], b[3], c[3];
char* a = substring(1, 5, strbuf, a, sizeof a);
char* b = substring(2, 6, strbuf, b, sizeof b);
char* c = substring(1, 4, strbuf, c, sizeof c);

ma tuttavia testando ottengo (con le righe qui sotto) : 0,0,0
Serial.println(atoi(a));
Serial.println(atoi(b));
Serial.println(atoi(c));

qualche idea? grazie mille

Ora creo le 3 stringhe di destinazione in questo modo:

char a[3], b[3], c[3];

Non puoi creare un array con 3 spazi per stringhe di 3 caratteri, in C devi sempre prevedere il posto per il terminatore di stringa /NULL quindi prova con:

char a[4], b[4], c[4];

Altra cosa:

char* a = substring(1, 5, strbuf, a, sizeof a);
char* b = substring(2, 6, strbuf, b, sizeof b);
char*  c = substring(1, 4, strbuf, c, sizeof c);

Ricorda anche che in C i contatori partono da 0 (zero) e non da 1
Non hai messo le parentesi dopo sizeof quindi che parametro gli passi ?

char* a = substring(0, 2, strbuf, a, sizeof(a));
char* b = substring(2, 4, strbuf, b, sizeof(b));
char*  c = substring(4, 6, strbuf, c, sizeof(c));

tutte osservazioni corrette, ma anche implementandole non cambia nulla. la cosa si fa abbastanza frustrante (in java a quest'ora era già bello che scritto, ma vabbe , lasciamo java agli altri :D)

eventualmente per risolvere il problema ci sarebbe un'altra soluzione, dal momento che con le stringhe mi pare essere tutto un po' più complesso, potrei lavorare con i numeri, pero attualmente non saprei come fare per:

dato un numero di tipo >> 16764074
farlo convertire in esadecimale >> 0xffccaa
farlo dividere in 3 esadecimali del tipo 0xff 0xcc 0xaa
e infine convertire i 3 esadecimali in interi 255 204 170

qualche idea :expressionless:

Intanto come funzione substring prova la seguente:

char* substring(const char* str, size_t begin, size_t len)
{
  if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))
    return 0;

  return strndup(str + begin, len);
}

Ricorda poi di liberare la memoria allocata

Ecco un’esempio completo:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

char* substring(const char* str, size_t begin, size_t len)
{
  if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))
    return 0;

  return strndup(str + begin, len);
}


int main()
{
  size_t      begin  = 5;
  size_t      end    = 10;

  const char* str    = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  char*       substr = substring(str, begin, end);

  printf("str    = %s\n", str);
  printf("substr starting from pos %u, and %u characters in length...\n", begin, end);
  printf("substr = %s which has a strlen of %u\n", substr, strlen(substr));

  free(substr);

  return 0;
}

Per convertire da int a esadecimale puoi usare tranquillamente sprintf() che invia il risultato in una stringa.
usando %x o %X per avere caratteri minuscoli o maiuscoli, ricorda che il numero deve essere un “unsigned int”

quindi:

char stringaesadecimale[9];

int sprintf (stringaesadecimale, %X, “12345678”)