Quali opzioni di terze parti ci sono per lavorare con le stringhe in C?

Sono stato a conoscenza per un po ‘di codice circa 17 volte più veloce in Python che in C, e presumo di aver pensato che non ero un gran programmatore fino a quando non ci ho pensato veramente e ho capito che l’unico problema è che posso ‘maneggiare C stringhe / matrici di carbone / puntatori di carbone / qualsiasi altra cosa. Ho un blocco su di loro, e manipolarli mi prende ore. Non ho questo problema in C ++.

Ma la vita mi costringe a codificare in puro C al momento, e sto cercando di scoprire se c’è qualche libreria di terze parti che posso aggiungere che mi renderà la vita più facile. Ho fatto qualche ricerca su google e non ho trovato molto. Sto iniziando a pensare di farcela da solo, ma mi sento come se stessi reinventando la ruota. Sicuramente c’è qualcosa là fuori? Qualcuno sa di qualcosa del genere? Qualcosa che rende C un po ‘più simile al C ++ in questo senso. Mi rendo conto che è un’idea sciocca, dato che questo è il punto del C ++, ma tu capisci, ne sono sicuro.

C’è la Better String Library , che è una libreria C pura per lavorare con “stringhe” che cerca di evitare molti dei problemi con la gestione della stringa C standard.

http://developer.gnome.org/glib/2.34/glib-utilities.html

http://developer.gnome.org/glib/2.34/glib-Strings.html

È il fondamento di gnome, ma puoi usarlo indipendentemente dallo gnomo, penso. Secondo la pagina panoramica, “Funziona su molte piattaforms simili a UNIX, così come su Windows e OS X.”

È ansible iniziare a risolvere il problema del puntatore / array / stringa leggendo le domande correlate su SO. Non c’è carenza di tali domande.

Ci sono alcune cose importanti che devi imparare e capire per scrivere codice C corretto contenente puntatori / matrici / stringhe:

  1. Dichiarazioni di puntatori, matrici, indicatori di puntatori, puntatori a matrici, matrici di array, matrici di indicatori e così via e così via. Le dichiarazioni C sono davvero strane per chi non lo sapesse. Ma sono apprendibili e ci sono alcuni strumenti come cdecl che possono tradurre rapidamente dichiarazioni abracadabrish in inglese semplice o viceversa.
  2. Se vedi che una funzione dichiara uno dei suoi parametri come una matrice (ad esempio void f(int a[]) ), non credere ai tuoi occhi. È un puntatore, non un array. In C, gli array non vengono mai passati come argomenti di funzione. Sono passati solo i puntatori. La syntax è ingannevole e i creatori di C sono stati / sono dispiaciuti per cose come questa, ma questa è tutta una storia ora. Non puoi cambiarlo
  3. In tutte le espressioni C (da non confondere con dichiarazioni e definizioni), ad eccezione di una, gli array si comportano come puntatori al loro primo elemento. L’eccezione è l’operatore sizeof . sizeof(array) ti restituirà la vera dimensione dell’array in chars . Ma nel momento in cui sizeof(array+0) , hai convertito la array in un’espressione di tipo puntatore che punta array[0] e in questo caso sizeof ti restituirà la dimensione del puntatore.
  4. Non è ansible assegnare gli array. Puoi inizializzarli quando li definisci, puoi copiarli, ma non assegnare con = dopo che sono stati definiti.
  5. Non ci sono stringhe in C sotto forma di un tipo fondamentale. Ci sono solo chars , matrici di chars e puntatori a chars e puntatori a matrici di chars e spesso ci riferiamo a tutti come archi, ma in realtà non lo sono. La cosa che vedi come una stringa, ad esempio "I am a string. Or maybe I'm not." è chiamato letterale stringa e da qualche parte c’è una matrice di chars associati ad esso. Dico da qualche parte, perché la stringa letterale si comporta diversamente in diversi contesti. In tutte le espressioni C (da non confondere con le dichiarazioni / definizioni), ad eccezione di una, i valori letterali delle stringhe si comportano come un puntatore al primo char di una matrice contenente il testo del letterale. L’eccezione è, ancora una volta, sizeof . Restituirà la dimensione della matrice sottostante di chars in qualcosa come sizeof("ABC") . Di nuovo, proprio come con gli array, nel momento in cui scrivi sizeof("ABC"+0) , hai convertito "ABC" in un puntatore a char e sizeof ti restituirà la dimensione del puntatore.
  6. Non si deve tentare di modificare gli array di char creati da string letterali: "ABC"[0] = 'Z'; è un comportamento indefinito. E così è char* p = "ABC"; p[0] = 'Z'; char* p = "ABC"; p[0] = 'Z'; o l’equivalente char* p = "ABC"; *p = 'Z'; char* p = "ABC"; *p = 'Z'; .
  7. È ansible utilizzare stringhe letterali per inizializzare array di chars o puntatori a chars (è anche ansible assegnare stringhe letterali ai puntatori, ma non agli array, gli array non sono assegnabili, come indicato in precedenza). Quello che succede dipende da ciò che stai iniziando. In char a[] = "Hello"; o in char a[] = { "Hello!" }; char a[] = { "Hello!" }; crei una serie di chars e ne imposti il ​​contenuto come testo nella stringa letterale. Ed è ansible modificare tale matrice in seguito, se necessario. In char* p = "World!"; crei un array di char contenenti il ​​testo della stringa letterale e crei un puntatore a un char punta al primo char di quell’array. In questo caso non è ansible modificare l’array come ho sottolineato in precedenza.
  8. Due o più valori letterali stringa adiacenti delimitati dallo spazio si fondono in uno: "Hello" " World!" è lo stesso di "Hello World!" .
  9. C’è anche l’aritmetica dei puntatori, ma è facile.

Questo è tutto. Dichiarazioni principali, matrici master in espressioni e parametri di funzione, guarda i tuoi valori letterali di stringa.

Mentre reinventare la ruota non è sempre desiderato. Tendo a pensare che così facendo ottieni una maggiore comprensione di come funzionano le cose. Tuttavia, non sono sicuro del tipo di frame temporale in cui stai lavorando. Altrimenti, come menzionato in un’altra risposta, Better String Library è molto buono.