Array e Stringhe
Array monodimensionali e multidimensionali, stringhe C, libreria string.h.
Array Monodimensionali
Un array è una sequenza di elementi dello stesso tipo, memorizzati in modo contiguo in memoria.
#include <stdio.h>
int main() {
// Dichiarazione e inizializzazione
int numeri[5] = {10, 20, 30, 40, 50};
// Inizializzazione parziale (i restanti sono 0)
int parziale[5] = {1, 2}; // {1, 2, 0, 0, 0}
// Dimensione dedotta automaticamente
double prezzi[] = {1.99, 3.50, 2.25, 4.80};
int n = sizeof(prezzi) / sizeof(prezzi[0]); // Dimensione array
// Accesso con indice (0-based)
printf("Primo elemento: %d\n", numeri[0]); // 10
printf("Ultimo elemento: %d\n", numeri[4]); // 50
// Modifica
numeri[2] = 99;
// Iterazione con for
printf("\nArray numeri: ");
for (int i = 0; i < 5; i++) {
printf("%d ", numeri[i]);
}
// Calcola media dei prezzi
double somma = 0;
for (int i = 0; i < n; i++) somma += prezzi[i];
printf("\nMedia prezzi: %.2f\n", somma / n);
return 0;
}
arr[10] su un array di 5 elementi è undefined behavior e può causare crash o corruzione silente dei dati. Controlla sempre gli indici!
Array Bidimensionali (Matrici)
#include <stdio.h>
#define RIGHE 3
#define COLONNE 3
void stampa_matrice(int m[RIGHE][COLONNE]) {
for (int i = 0; i < RIGHE; i++) {
for (int j = 0; j < COLONNE; j++) {
printf("%4d", m[i][j]);
}
printf("\n");
}
}
int main() {
// Inizializzazione
int matrice[RIGHE][COLONNE] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
printf("Matrice originale:\n");
stampa_matrice(matrice);
// Trasposta
int trasposta[RIGHE][COLONNE];
for (int i = 0; i < RIGHE; i++)
for (int j = 0; j < COLONNE; j++)
trasposta[j][i] = matrice[i][j];
printf("\nTrasposta:\n");
stampa_matrice(trasposta);
// Somma della diagonale principale
int diag = 0;
for (int i = 0; i < RIGHE; i++) diag += matrice[i][i];
printf("\nTraccia (somma diagonale): %d\n", diag);
return 0;
}
Stringhe in C
In C una stringa è un array di char terminato dal carattere nullo '\0'. Non esiste un tipo "string" nativo (a differenza del C++).
#include <stdio.h>
#include <string.h>
int main() {
// Dichiarazione
char s1[] = "Hello"; // Automaticamente: {'H','e','l','l','o','\0'}
char s2[20] = "World"; // Buffer di 20 char, occupa 6 (5+\0)
char s3[20]; // Non inizializzata
printf("s1 = %s, lunghezza = %zu\n", s1, strlen(s1)); // 5
// Input di una stringa (con spazi: usa fgets)
printf("Inserisci una frase: ");
fgets(s3, sizeof(s3), stdin);
// fgets include il \n finale, rimuoviamolo:
s3[strcspn(s3, "\n")] = '\0';
printf("Hai scritto: %s\n", s3);
// Accesso carattere per carattere
for (int i = 0; s1[i] != '\0'; i++) {
printf("s1[%d] = '%c' (ASCII %d)\n", i, s1[i], s1[i]);
}
return 0;
}
Libreria string.h
| Funzione | Descrizione | Esempio |
|---|---|---|
| strlen(s) | Lunghezza della stringa (senza \0) | strlen("hello") → 5 |
| strcpy(dst, src) | Copia src in dst | strcpy(buf, "ciao") |
| strncpy(dst, src, n) | Copia al massimo n caratteri (più sicuro) | strncpy(buf, s, 19) |
| strcat(dst, src) | Concatena src alla fine di dst | strcat(buf, " mondo") |
| strcmp(a, b) | Confronta: 0 se uguali, <0 o >0 altrimenti | strcmp("ab","ab") → 0 |
| strchr(s, c) | Puntatore alla prima occorrenza di c in s | strchr("hello", 'l') |
| strstr(s, sub) | Puntatore alla prima occorrenza di sub in s | strstr("hello world", "world") |
| sprintf(buf, fmt, ...) | Come printf ma scrive in una stringa | sprintf(buf, "%d", n) |
#include <stdio.h>
#include <string.h>
#include <ctype.h> // toupper, tolower, isalpha, isdigit
int main() {
char a[100] = "Hello";
char b[] = " World!";
// Concatenazione
strcat(a, b);
printf("strcat: %s\n", a); // Hello World!
// Lunghezza
printf("strlen: %zu\n", strlen(a)); // 12
// Confronto
printf("strcmp: %d\n", strcmp("abc", "abc")); // 0
printf("strcmp: %d\n", strcmp("abc", "abd")); // negativo
// Cerca sottostringa
char *pos = strstr(a, "World");
if (pos) printf("'World' trovato a posizione %ld\n", pos - a);
// Converti in uppercase con ctype.h
char copia[100];
strcpy(copia, "hello world");
for (int i = 0; copia[i]; i++) copia[i] = toupper(copia[i]);
printf("Uppercase: %s\n", copia);
// Controlla se una stringa contiene solo cifre
char test[] = "12345";
int solo_cifre = 1;
for (int i = 0; test[i]; i++) {
if (!isdigit(test[i])) { solo_cifre = 0; break; }
}
printf("'%s' solo cifre? %s\n", test, solo_cifre ? "Sì" : "No");
return 0;
}
Leggi N interi (max 100). Calcola e stampa: minimo, massimo, media, somma. Poi stampa l'array ordinato in modo crescente (usa bubble sort o selection sort).
#include <stdio.h>
int main() {
int arr[100], n;
printf("Quanti numeri? ");
scanf("%d", &n);
for (int i = 0; i < n; i++) { printf("arr[%d]: ", i); scanf("%d", &arr[i]); }
int min = arr[0], max = arr[0];
long long somma = 0;
for (int i = 0; i < n; i++) {
if (arr[i] < min) min = arr[i];
if (arr[i] > max) max = arr[i];
somma += arr[i];
}
printf("Min: %d, Max: %d, Media: %.2f, Somma: %lld\n",
min, max, (double)somma/n, somma);
// Bubble sort
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-i-1; j++)
if (arr[j] > arr[j+1]) { int t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=t; }
printf("Ordinato: ");
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
printf("\n");
return 0;
}Leggi una frase (con spazi). Conta: vocali, consonanti, spazi, cifre e altri caratteri. Stampa anche la frase capovolta.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
char frase[200];
printf("Inserisci una frase: ");
fgets(frase, sizeof(frase), stdin);
frase[strcspn(frase, "\n")] = '\0';
int vocali=0, consonanti=0, spazi=0, cifre=0, altri=0;
char vocali_str[] = "aeiouAEIOU";
for (int i = 0; frase[i]; i++) {
char c = frase[i];
if (strchr(vocali_str, c)) vocali++;
else if (isalpha(c)) consonanti++;
else if (c == ' ') spazi++;
else if (isdigit(c)) cifre++;
else altri++;
}
printf("Vocali: %d, Consonanti: %d, Spazi: %d, Cifre: %d, Altri: %d\n",
vocali, consonanti, spazi, cifre, altri);
// Capovolgi
int len = strlen(frase);
printf("Capovolta: ");
for (int i = len-1; i >= 0; i--) printf("%c", frase[i]);
printf("\n");
return 0;
}Leggi due matrici A (MxK) e B (KxN). Calcola e stampa il prodotto C = A×B (matrice MxN). Per calcolare C[i][j], somma A[i][k]*B[k][j] per k da 0 a K-1.
#include <stdio.h>
#define MAX 10
void stampa(int m[][MAX], int r, int c) {
for (int i=0; i<r; i++) {
for (int j=0; j<c; j++) printf("%6d", m[i][j]);
printf("\n");
}
}
int main() {
int A[MAX][MAX], B[MAX][MAX], C[MAX][MAX] = {0};
int M, K, N;
printf("A righe, colonne/righe B, B colonne (M K N): ");
scanf("%d %d %d", &M, &K, &N);
printf("Inserisci A (%dx%d):\n", M, K);
for (int i=0; i<M; i++) for (int j=0; j<K; j++) scanf("%d", &A[i][j]);
printf("Inserisci B (%dx%d):\n", K, N);
for (int i=0; i<K; i++) for (int j=0; j<N; j++) scanf("%d", &B[i][j]);
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
for (int k=0; k<K; k++)
C[i][j] += A[i][k] * B[k][j];
printf("\nA:\n"); stampa(A,M,K);
printf("B:\n"); stampa(B,K,N);
printf("C = A x B:\n"); stampa(C,M,N);
return 0;
}Leggi una frase. Separala in parole usando strtok(). Stampa ogni parola su una riga con la sua lunghezza. Poi stampa la parola più lunga e quella più corta.
#include <stdio.h>
#include <string.h>
int main() {
char frase[200];
printf("Inserisci una frase: ");
fgets(frase, sizeof(frase), stdin);
frase[strcspn(frase, "\n")] = '\0';
char lunga[50] = "", corta[50] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
int conta = 0;
char *token = strtok(frase, " \t");
while (token != NULL) {
int len = strlen(token);
printf(" %-20s (lunghezza: %d)\n", token, len);
conta++;
if (len > (int)strlen(lunga)) strcpy(lunga, token);
if (len < (int)strlen(corta)) strcpy(corta, token);
token = strtok(NULL, " \t");
}
printf("\nTotale parole: %d\n", conta);
printf("Più lunga: %s\n", lunga);
printf("Più corta: %s\n", corta);
return 0;
}Parte A: verifica se due parole sono anagrammi (stesse lettere in ordine diverso). Parte B: implementa il cifrario di Cesare — cifra e decifra una stringa con uno spostamento K (solo lettere, mantieni maiuscole/minuscole, ignora altri caratteri).
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// PARTE A: Anagramma
int sono_anagrammi(char *a, char *b) {
if (strlen(a) != strlen(b)) return 0;
int freq[256] = {0};
for (int i=0; a[i]; i++) freq[(unsigned char)tolower(a[i])]++;
for (int i=0; b[i]; i++) freq[(unsigned char)tolower(b[i])]--;
for (int i=0; i<256; i++) if (freq[i] != 0) return 0;
return 1;
}
// PARTE B: Cifrario di Cesare
void cesare(char *str, int k, int cifra) {
for (int i=0; str[i]; i++) {
if (isalpha(str[i])) {
char base = isupper(str[i]) ? 'A' : 'a';
if (cifra)
str[i] = base + (str[i] - base + k) % 26;
else
str[i] = base + (str[i] - base - k + 26) % 26;
}
}
}
int main() {
// Anagramma
char p1[50], p2[50];
printf("Prima parola: "); scanf("%s", p1);
printf("Seconda parola: "); scanf("%s", p2);
printf("Anagrammi? %s\n\n", sono_anagrammi(p1, p2) ? "Sì" : "No");
// Cifrario di Cesare
char frase[200];
int k;
printf("Frase da cifrare: ");
// Consuma il newline residuo
while (getchar() != '\n');
fgets(frase, sizeof(frase), stdin);
frase[strcspn(frase, "\n")] = '\0';
printf("Spostamento K: ");
scanf("%d", &k);
char copia[200];
strcpy(copia, frase);
cesare(copia, k, 1);
printf("Cifrata: %s\n", copia);
cesare(copia, k, 0);
printf("Decifrata: %s\n", copia);
return 0;
}