logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Program w C. Ma pobierać tekst od użytkownika i wstawiać w tablicę.

michalsokol 03 Gru 2006 11:46 2997 8
REKLAMA
  • #1 3288889
    michalsokol
    Poziom 12  
    Posty: 112
    Ocena: 18
    Moze ktos mi napisac program ktory bedzie pobieral tekst do uzytkownika i bedze wstawial go w tablice.
    ja napisalem cos takiego ale nie che dzialac:(


    char tekst[100];
    printf ("podaj tekst:\n");
    scanf ("%c",&tekst);
    printf ("tekst%s",tekst);

    prosze o rady
  • REKLAMA
  • #2 3289195
    Freeradio
    Poziom 15  
    Posty: 194
    Pomógł: 9
    Ocena: 4
    
    char tekst[256] = {0};  // Wypełnia wszystko znakami pustymi
    printf(">: ");
    scanf("%s", tekst);
    printf("\n%s", tekst);
    

    Urzywanie %c odnosi się do literału jednego bajtu.
    Z kolei wyłuskiwanie &tekst adresu daje typ char** i tutaj błąd.
    W C zachodzi niejawna konwersja od typu char[n] do typu char*, gdzie n = liczba naturalna.
  • #3 3289244
    michalsokol
    Poziom 12  
    Posty: 112
    Ocena: 18
    chcialem to wstawic do mojego programu ale co mi nie chce zadzialac?? widzi ktos tu jakis blad??


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

    int main(int argc, char *argv[])
    {
    printf ("******************************************************\n");
    printf ("******************************************************\n");
    printf ("******************** KOLO FORTUNY ********************\n");
    printf ("******************************************************\n");
    printf ("******************************************************\n\n\n");
    char haslo[256] = {0}; // Wypełnia wszystko znakami pustymi
    printf("podaj haslo ktore ma odgadnac przeciwnik:\n ");
    scanf("%s", haslo);



    int i;
    char tekst[]=haslo;
    char tekst2[50];
    char znak;
    for(i=0;tekst[i]!=NULL;i++)
    {
    if(tekst[i]!=' ')
    tekst2[i]='_';
    else
    tekst2[i]='-';
    }
    while(znak!='0')
    {
    printf("Podaj litere\n");
    scanf("%c", &znak);

    for(i=0;tekst[i]!=NULL;i++)
    {

    if(tekst[i]==znak)
    tekst2[i]=znak;



    }

    printf("%s%", tekst2);
    }

    system("PAUSE");
    return 0;
    }
  • REKLAMA
  • #4 3289471
    Freeradio
    Poziom 15  
    Posty: 194
    Pomógł: 9
    Ocena: 4
    Na szybkości, u mnie bez błędów w C
    
    #include <stdio.h> 
    #include <stdlib.h> 
    
    int main(int argc, char *argv[]) 
    { 
      printf ("******************************************************\n"); 
      printf ("******************************************************\n"); 
      printf ("******************** KOLO FORTUNY ********************\n"); 
      printf ("******************************************************\n"); 
      printf ("******************************************************\n\n\n");
       
      char haslo[256] = {0}; // Wypełnia wszystko znakami pustymi 
      printf("podaj haslo ktore ma odgadnac przeciwnik:\n "); 
      scanf("%s", haslo); 
    
      int i; 
      char tekst2[50] = {0},
           *tekst = haslo; 
      char znak = 0; 
      
      
      for(i=0; tekst[i] != 0; i++) 
      { 
        if(tekst[i] != ' ') 
           tekst2[i]= '_'; 
        else 
           tekst2[i]= '-'; 
      } 
      while( znak != '0') 
      { 
        printf("Podaj litere\n"); 
        znak = getchar(); 
    
        for(i=0; tekst[i] !=0 ;i++) 
        { 
          if( tekst[i] == znak) 
              tekst2[i] = znak; 
        } 
        printf("%s\n", tekst2); 
      } 
    
    system("PAUSE"); 
    return 0; 
    }

    Błąd był jeden - językowy. Natomiast występowały błędy które ujawiały się dopiero podczas działania. Pamiętaj by każdą tablicę lokalną zawsze wypełniać 0, bo kompilator może jej nadać przypadkowe wartości.
    Nie stosuj NULL, do definiowania znaku NUL na końcu c-napisu, NULL to pusty wskaźnik, a NUL to po prostu bajt zerowy.
  • #5 3290086
    michalsokol
    Poziom 12  
    Posty: 112
    Ocena: 18
    a moglbym prosic o komentarze co jest od czego i ten program zeby byl bez wskaznikow?? odpalam ten program i wyskakuja mi bledy:/
  • #6 3290984
    Freeradio
    Poziom 15  
    Posty: 194
    Pomógł: 9
    Ocena: 4
    Trochę poprawiłem, ale u mnie działa. A jakie błedy Ci sie pojawiały?
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <conio.h>  // getch()
    
    int main(int argc, char *argv[]) 
    { 
      printf ("******************************************************\n"); 
      printf ("******************************************************\n"); 
      printf ("******************** KOLO FORTUNY ********************\n"); 
      printf ("******************************************************\n"); 
      printf ("******************************************************\n\n\n"); 
        
      char haslo[256] = {0}; // Wypełnia wszystko znakami pustymi 
      printf("podaj haslo ktore ma odgadnac przeciwnik:\n "); 
      scanf("%s", haslo); // Pobiera do tablicy haslo, dane od urzytkownika
    
      int i; 
      char tekst2[50] = {0}; // Inicjuje tablice 0
      int znak = 0;         // Rownież 0, by kompilator nie dał przypadkowej wartości
      // w tej pętli chyba napis przerabiasz i maskujesz znakami _ i -
      for(i = 0; haslo[i] != 0; i++ ) 
      { 
        if(haslo[i] != ' ') 
           tekst2[i]= '_'; 
        else 
           tekst2[i]= '-'; 
      } 
      // Zgadywanie literki
      while( znak != '0') 
      { 
        printf("Podaj litere\n"); 
        znak = getch(); // Pobiera jeden znak od urzytkownika i zwraca jako int. Bezpieczniejsze od scanf
    
        for(i = 0; haslo[i] != 0; i++) 
            if( haslo[i] == znak ) tekst2[i] = znak; // Odsłoń znak
        printf("%s\n", tekst2); 
      } 
    system("PAUSE"); 
    return 0; 
    }
  • REKLAMA
  • #7 3291414
    michalsokol
    Poziom 12  
    Posty: 112
    Ocena: 18
    juz jest wszystko ok. mialem dev c++ 4 a teraz pobralem dev c+ 4.9.9.2 i jest ok. podejrzewam ze w tej 4 nie bylo bibliotek. ale mam jeszecze takie pytanie jak zrobic zeby ten program konczyl sie i podawal ile razy byla zgadywana litera??
  • REKLAMA
  • #8 3293860
    Freeradio
    Poziom 15  
    Posty: 194
    Pomógł: 9
    Ocena: 4
    To się da zrobić, chyba tak powinno wyglądać:
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <conio.h>  // getch() 
    #include <string.h> // strcmp()
    
    int main(int argc, char *argv[]) 
    { 
      printf ("******************************************************\n"); 
      printf ("******************************************************\n"); 
      printf ("******************** KOLO FORTUNY ********************\n"); 
      printf ("******************************************************\n"); 
      printf ("******************************************************\n\n\n"); 
        
      char haslo[256] = {0}; // Wypełnia wszystko znakami pustymi 
      printf("podaj haslo ktore ma odgadnac przeciwnik:\n "); 
      scanf("%s", haslo); // Pobiera do tablicy haslo, dane od urzytkownika 
    
      int i, iterator = 0; 
      char tekst2[50] = {0}; // Inicjuje tablice 0 
      int znak = 0;         // Rownież 0, by kompilator nie dał przypadkowej wartości 
      // w tej pętli chyba napis przerabiasz i maskujesz znakami _ i - 
      for(i = 0; haslo[i] != 0; i++ ) 
      { 
        if(haslo[i] != ' ') 
           tekst2[i]= '_'; 
        else 
           tekst2[i]= '-'; 
      } 
      // Zgadywanie literki 
      while( znak != '0') 
      { 
        printf("Podaj litere\n"); 
        znak = getch(); // Pobiera jeden znak od urzytkownika i zwraca jako int. Bezpieczniejsze od scanf 
    
        for(i = 0; haslo[i] != 0; i++)
            if( haslo[i] == znak ) { tekst2[i] = znak; } // Odsłoń znak 
        ++iterator;    
        printf("%s\n", tekst2);
        // Porównanie tablic napisowych - strcmp zwraca 0 jeśli napis tekst2 bedzie indentyczny z haslo
        if ( strcmp(tekst2, haslo) == 0 ) {
             printf("Koniec. Odgadles za %d razem\n", iterator);
             break; // Wyskok z pierwszej pętli
             }
      } 
    system("PAUSE"); 
    return 0; 
    }

    Powinno działać :)
  • #9 3294071
    michalsokol
    Poziom 12  
    Posty: 112
    Ocena: 18
    Wielkie dzieki za pomoc:)!!!

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z napisaniem programu w języku C, który pobiera tekst od użytkownika i zapisuje go do tablicy znaków. Początkowy kod używał niewłaściwego formatu scanf ("%c" zamiast "%s") oraz błędnego przekazywania adresu tablicy, co powodowało błędy. W odpowiedziach zaproponowano poprawne użycie funkcji scanf z formatem "%s" do wczytania ciągu znaków do tablicy char. Przykładowe programy zawierały deklarację tablicy znaków z inicjalizacją zerami, poprawne pętle iterujące po znakach tablicy oraz zamianę znaków na podkreślenia lub myślniki. Wskazano także na konieczność użycia odpowiednich bibliotek, takich jak stdio.h, stdlib.h, conio.h i string.h. Autor pytał o wersje kompilatora, które mogą wpływać na działanie programu; zmiana z Dev C++ 4 na 4.9.9.2 rozwiązała problemy z bibliotekami. W końcowej fazie dyskusji pojawiła się prośba o dodanie funkcjonalności liczenia liczby zgadywanych liter oraz zakończenia programu z podaniem tej informacji, co również zostało omówione i zilustrowane przykładowym kodem.
Wygenerowane przez model językowy.
REKLAMA