Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [C] string lowercase

  1. #1

    [C] string lowercase

    ciao a tutti
    ho bisogno di convertire i caratteri maiuscoli di una strina, in caratteri minuscoli

    navigando qua e la mi sono accorto dell'esistenza della funzione "strlwr", ma da quello che ho capito non è nello standard c, infatti , se usata, mi dava errore (il compilare norn riusciva a trovarla)

    per cui ho deciso di costruine una io (se c'è un metodo per usare quella predefinita fatemelo sapere), consultando pagine web che, praticamente, la riportavano già fatta
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    char * strlwr2 (char *a)
    {
      char *ret = a;
    
      while (*a != '\0'){
    	if (isupper (*a)){
    		printf("lettera da convertire %c\n", *a);         //stampa esattamente la lettera che voglio
    		*a = tolower ((unsigned char)*a);                  //qui la segmentation fault
    	}
    	++a;
        }
    
      return ret;
    }
    
    
    int main()
    {
    char * pippo;
    pippo ="cIaO";
    printf("stringa %s\n", pippo);
    pippo=strlwr2(pippo);
    printf("stringa %s\n", pippo);
    }
    ma al momento dell'esecuzione salta fuori una segmentation fault, precisamente
    Segmentation fault (core dumped)
    nella riga commentata sopra....

    per compilare uso il classico gcc, su una ubuntu

    come posso risolvere il mio problema?? grazie

  2. #2
    Utente di HTML.it L'avatar di Francis87
    Registrato dal
    Jun 2003
    Messaggi
    5,970
    codice:
    #include <stdio.h>
    
    void str2lwc(char *s);
    
    void str2lwc(char *s) {
      int i;
      for (i=0; *(s+i)!='\0'; i++) {
        if (*(s+i)!=0 && *(s+i) >= 65 && *(s+i) <= 90) {
          *(s+i) += 32;
        }
      }
    }
    
    int main() {
     char s[] = "STRinga";
     printf("Stringa originale: %s\n",s);
     str2lwc(s);
     printf("Stringa nuova: %s\n",s);
    
     return 0;
    }
    Heaven's closed. Hell sold out.

    Linux 2.6.26-2-amd64
    Debian squeeze

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Oppure

    codice:
    char * mystrlwr(char * s)
    {
      char *cp;
    
      for (cp=s; *cp; ++cp)
        if ('A' <= *cp && *cp <= 'Z')
          *cp += 'a' - 'A';
    
      return(s);
    }

  4. #4
    Utente di HTML.it L'avatar di Francis87
    Registrato dal
    Jun 2003
    Messaggi
    5,970
    come mai ricevo un segmentation fault se dichiaro la stringa come
    codice:
    char *s = "STRINga";
    ?

    Così
    codice:
    char s[] = "STRINga";
    funziona benissimo.

    Heaven's closed. Hell sold out.

    Linux 2.6.26-2-amd64
    Debian squeeze

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Perche' nel secondo caso viene allocato lo spazio per la stringa nello stack dal compilatore e lì viene inizializzata con il valore indicato. Nel primo, hai solamente il puntatore e l'area in cui e' depositata la stringa (che e' una costante) e' posto in un segmento dell'eseguibile che sara' di sola lettura.

    Dato che tu "scrivi" modificando le lettere da maiuscole in minuscole, nel primo caso hai l'errore (non puoi scrivere nell'area delle costanti) e nel secondo no perche' scrivi nello stack.

  6. #6
    O anche:
    codice:
    char * mystrlwr(char * s)
    {
      char *cp;
    
      for (cp=s; *cp; ++cp)
        *cp=(char)tolower(*cp);
      return(s);
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    perfetto, grazie

    un'altra cosa
    esiste gia' una funzione strlwr, ma non fa parte dell'ansi standard
    c'e' modo di utilizzarla? in questo sito
    http://www.thinkage.ca/english/gcos/...ib/strlwr.html
    viene detto di aggiungere una libreria
    codice:
    Usage:
    
    #include <sdgstd.h>
    s2 = strlwr( s1 );
    ma non ce l'ho..


    codice:
    error: sdgstd.h: No such file or directory

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.