Stringa

toni1705

Nuovo Utente
98
9
devo creare un programma in grado di
Sviluppare una function C che, data come parametro di input una stringa che rappresenta un testo
in italiano, determina e restituisce come parametro di output il numero di parole che iniziano con
a e terminano con e contenute nel testo. Nel testo le parole sono separate da un unico spazio.
mi date qualche idea?
 

toni1705

Nuovo Utente
98
9
e poi come cerco le parole che iniziano con a e terminano in e'? faccio due cicli se la parola termina con a aumento il contatore affinchè scorra fino all'ultima parola se l'ultima lettera è :'"e'"
aggiungo al totale contatore?
 

pabloski

Utente Èlite
2,868
916
e poi come cerco le parole che iniziano con a e terminano in e'? faccio due cicli se la parola termina con a aumento il contatore affinchè scorra fino all'ultima parola se l'ultima lettera è :'"e'"
aggiungo al totale contatore?

Logicamente con strtok generi un array di parole che va scorso dall'inizio alla fine.

Per ogni stringa vai a guardare se il primo e l'ultimo carattere corrispondono a quelli voluti. Però se fai queste domande temo tu non abbia capito affatto come C rappresenta le stringhe. Fossi in te mi concentrerei su questo punto che è vitale, altrimenti non riuscirai mai a creare programmi funzionanti che manipolano le stringhe.
 
  • Mi piace
Reazioni: rctimelines

toni1705

Nuovo Utente
98
9
la stringa viene rappresentata come delle piccole scatole
in ogni scatola c'è una lettere
tipo CIAO ha 3 scatole

C= indice 0
I=indice 1
A=indice 2
O= indice 3
 

Sysken

Nuovo Utente
51
20
La funzione strtok restituisce il puntatore alla stringa, e restituisce NULL alla fine della stringa in ingresso.
Quindi while (...!=NULL) ricavi la stringa e la elabori, nel caso in cui il primo elemento è uguale ad a e l'ultimo ad e incrementi un contatore.
 

toni1705

Nuovo Utente
98
9
La funzione strtok restituisce il puntatore alla stringa, e restituisce NULL alla fine della stringa in ingresso.
Quindi while (...!=NULL) ricavi la stringa e la elabori, nel caso in cui il primo elemento è uguale ad a e l'ultimo ad e incrementi un contatore.
mi conviene usare strelen -1 per il penultimo carattere (perchè l'ultimo carattere è \0) giusto?
per il primo carattere?
Questa è la visione astratta, ma tu hai bisogno di sapere come le rappresenta ed interpreta il C. E ovviamente ti serve andare a guardare le funzioni su stringhe https://it.cppreference.com/w/c/string/byte
sisi userò una strstr più una strtok.
 

Sysken

Nuovo Utente
51
20
Perchè dovresti usare strstr?
Strstr restituisce il puntatore ad una stringa che stai ricercando all'interno di un'altra stringa (ovviamente la prima occorrenza) altrimenti NULL.
Una stringa in C non è nient'altro che un array di char, nulla di diverso da un'array di interi, l'unica particolarità sta nella necessità di preservare una locazione per un delimitatore/terminatore '/0'. Per accedere al primo elemento di una stringa dunque devo fare riferimento all"elemento in posizione 0 ossia string [0]. Ora ricordiamo che strlen restituisce il numero di caratteri presenti in una stringa, escluso il terminatore ovviamente. Dal momento che gli indici partono da 0 (e questo è facile da spiegare, il nome di un'array altro non è che un puntatore alla locazione di memoria che contiene il primo elemento dell'array, questo puntatore é il nostro indirizzo base a cui fare riferimento per ogni accesso in memoria, string[0] = *(string + 0), string [1] = *(string + 1), attenzione però quell'1 non è assoluto, nel senso, presa ad esempio l'architettura ARM a 32 bit in cui la memoria è indirizzata a byte, quell'1 e qualsiasi altro numero viene moltiplicato per 4, infatti 4 (byte)*8bit = 32 bit, in questo modo otteniamo l'indirizzo di memoria, detto in modo davvero semplice e ridotto.) risulta ovvio decrementare il risultato di strlen di 1.
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
la stringa viene rappresentata come delle piccole scatole
in ogni scatola c'è una lettere
tipo CIAO ha 3 scatole

C= indice 0
I=indice 1
A=indice 2
O= indice 3
Sono 4

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Perchè dovresti usare strstr?
Strstr restituisce il puntatore ad una stringa che stai ricercando all'interno di un'altra stringa (ovviamente la prima occorrenza) altrimenti NULL.
Una stringa in C non è nient'altro che un array di char, nulla di diverso da un'array di interi, l'unica particolarità sta nella necessità di preservare una locazione per un delimitatore/terminatore '/0'. Per accedere al primo elemento di una stringa dunque devo fare riferimento all"elemento in posizione 0 ossia string [0]. Ora ricordiamo che strlen restituisce il numero di caratteri presenti in una stringa, escluso il terminatore ovviamente. Dal momento che gli indici partono da 0 (e questo è facile da spiegare, il nome di un'array altro non è che un puntatore alla locazione di memoria che contiene il primo elemento dell'array, questo puntatore é il nostro indirizzo base a cui fare riferimento per ogni accesso in memoria, string[0] = *(string + 0), string [1] = *(string + 1), attenzione però quell'1 non è assoluto, nel senso, presa ad esempio l'architettura ARM a 32 bit in cui la memoria è indirizzata a byte, quell'1 e qualsiasi altro numero viene moltiplicato per 4, infatti 4 (byte)*8bit = 32 bit, in questo modo otteniamo l'indirizzo di memoria, detto in modo davvero semplice e ridotto.) risulta ovvio decrementare il risultato di strlen di 1.
Penso che riferimento all'architettura ARM abbia contribuito a chiarire molto le idee all'OP. Complimenti per la nozione indispensabile.

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

Sysken

Nuovo Utente
51
20
Penso che riferimento all'architettura ARM abbia contribuito a chiarire molto le idee all'OP. Complimenti per la nozione indispensabile.

Inviato dal mio Nexus 5 utilizzando Tapatalk
Era solo per introdurre il concetto di indirizzo (e dell'aritmetica dei puntatore), non deve conoscere proprio nulla dell'architettura ARM, niente ironia, grazie. :)
 

toni1705

Nuovo Utente
98
9
C:
#include <stdio.h>
#include <string.h>
int conta(char s1[],int n);
void main()
{
  char s1[100];
  int numero;
  printf("inserire la vostra frase\n");
  fgets(s1,100,stdin);
   numero=conta(s1,100);
   printf("\nla parola che inizia con a \x8A stata trovata:%d",numero);
}

int conta(char s1[],int n)
{
char* tmp;
int i =0;
tmp = strtok(s1, " ");
for ( ; tmp != NULL; tmp = strtok(NULL, " "))
{
if ((tmp[i] == 'a') && (tmp[strlen(tmp)-1] == 'e'))
{
i++;
}
}
return i;
}
mi riporta sempre 1 nonostante inserisca parole come allarme alle amare ecc.
ma quel dato logico cos'è alla fine xD?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Per forza, ci sono 2 problemi:

- devi accedere alla posizione 0 di tmp, e non alla posizione i;
- l'ultima parola non verrà contata in quanto viene cercato come token lo spazio;

se immetti infatti "allarme alle amare ", vedrai 3 parole (a patto di accedere a tmp[0]).
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili