IT şi electronică > Programare

siruri de caractere

(1/1)

automat:
Salut. De curand am trecut la capitolul "Siruri".
Legat de acest lucru am o problema si anume : sa se afiseze toate prefixele si toate sufixele unui cuvant citit de la tastatura.
Ex: prefixele cuvantului "animal" : a, an, ani, anim, anima, animal
     sufixele : animal, nimal, imal, mal, al, l.
Am incercat sa afisez sufixele prin doua metode : o data utilizand functia strlen();
                                                                   a doua oara parcurgand sirul ca in cazul unui vector de caractere.
In cazul afisarii prefixelor din pacate nu am reusit nimic.
Astept sfaturi. Multumesc.

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

int main()
{
    int i, j;
    char sir[256];
    printf("\n Scrieti un cuvant : ");
    gets(sir);
    printf("\n");
    for(i=0; i<strlen(sir); i++)
    printf(" %s", sir+i);
    printf("\n\n");
    for(i=0; sir!='\0'; i++)
    {
        for(j=i; sir[j]!='\0'; j++)
        printf(" %s", sir[j]);
    }
    printf("\n");
}

tavy:
Pentru ce „#include<stdlib.h>”?

Poți încerca așa:

--- Cod: ---#include<stdio.h>
#include<string.h>

int main(){
  int i,n;
  char sir[256]; /*De ce 256? Dar daca asa vrei tu ...*/
  printf("\nScrieți un cuvânt: ");
  scanf("%255s",sir); /* Niciodata, niciodata, niciodata nu folosim gets, poate doar daca inputul este de la o sursa de incredere, si nu exista astfel de sursa*/
  n=strlen(sir);
  printf("Prefixe:\n");
  for(i=0;i<n;i++)printf("%.*s\n",i+1,sir);
  printf("Sufixe:\n");
  for(i=0;i<n;i++)printf("%s\n",sir+i);
  return 0;
}

--- Terminare cod ---

Încearcă să eviți secvențe de genul „for(i=0; i<strlen(sir); i++)”, apelează de prea multe ori „strlen”. Cel mai bine îl apelezi o singură dată și memorezi rezultatul într-o variabilă.

Recomand să citești:
http://linux.die.net/man/3/scanf
http://linux.die.net/man/3/printf
http://linux.die.net/man/3/gets

--- Citat ---Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead.
--- Terminare citat ---
Eu nu am folosit „fgets”, am folosit „scanf” pentru că avem de citit un cuvânt și asta înseamnă că trebuiesc ignorate spațiile.

automat:
Multumesc pentru sfaturi.
Si acum am o intrebare referitor la :

char sir[256];  /*De ce 256? Dar daca asa vrei tu ...*/

Nu este bine in felul asta ? Te referi la dimensiunea introdusa ?
Ar fi fost mai bine asa ?

 #define k 256
  char sir[k]

tavy:

--- Citat din: automat din Martie 28, 2012, 11:01:46 p.m. ---char sir[256];  /*De ce 256? Dar daca asa vrei tu ...*/

Nu este bine in felul asta ? Te referi la dimensiunea introdusa ?

--- Terminare citat ---

Mă gândeam că dimensiunea șirului este oarecum arbitrară, Eu aș fi ales 100 sau 200 sau eventual 101, 201 ca să las loc suplimentar pentru terminatorul de șir. Nu văd ce motiv ai avut să alegi 256 (28), pentru că nu apare nici o optimizare din chestia asta.
Chestia cu „#define” are sens în unele cazuri dar în programe ceva mai complexe când vrei să scoți undeva în față dimensiunea șirului ca să o poți modifica ușor.
Dacă este să vorbim de optimizări atunci nu ar strica ca șirul să nu fie variabilă locală, „char sir[256]” pus în „main()” va aloca 256 de octeți în stivă, dacă programezi un microcontroler atunci ai mari șanse ca dimensiunea stivei să fie foarte limitată. În aceste condiții ori declari „sir” ca variabilă globală, ori îl faci pe „sir” pointer la „char” și îi aloci memorie dinamic. Dar astea sunt deja chestii de finețe, pe un calculator normal din zilele noastre nu este nici o problemă să alocăm în stivă 256 de octeți, dacă ai fi programat acum mai bine de 15-20 de ani pe un 8086 sau chiar pe un 80386 în mod real (ce vremuri) și ai fi avut o stivă de doar 64k (dacă țin bine minte) ai fi fost ceva mai zgârcit cu utilizarea stivei.

Navigare

[0] Indexul de Mesaje

Du-te la versiunea completă