• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablice znakow - wpisywanie w tablice i odczytywanie.

VPS Starter Arubacloud
0 głosów
328 wizyt
pytanie zadane 13 grudnia 2021 w C i C++ przez Raven2221 Nowicjusz (200 p.)

Witam!

Jestem studentem pierwszego roku informatyki, i walcze z zadaniami z tablicami znakow - pewnie to nic trudnego, ale nie moge niestety poradzic sobie z jednym poleceniem. Oto tresc:

Napisz program w języku ANSI C, który pobierze od użytkownika liczbę naturalną n  , a następnie do 100-elementowej tablicy typu char wpisze znaki podane przez użytkownika, a następnie skopiuje do kolejnej statycznej 100-elementowej tablicy tab_rev typu char znaki zapisane w odwrotnej kolejności.

Następnie tablicę ze znakami w odwrotnej kolejności wypisujemy na ekran.

Zastanów się nad wczytywaną ilością znaków do tablicy typu char!

Nie piszemy kodu wypisującego elementy na ekranie oraz nie usuwamy linii print_tab(tab,n)!!!

W przypadku sytuacji błędnych program wypisuje komunikat: BŁĄD i kończy działanie.

Probowalem roznych opcji- najpierw z uzyciem scanf do wpisywania w tablice, ale scanf uparcie konczy wpisywanie na spacjach, a tu trzeba uwzglednic spacje i inne znaki specjalne. Probowalem z getcharem, ale w tym wypadku, jezeli wpisze mniej znakow niz zadeklarowalem to brak uzupelniany jest dziwnym znakiem. Wklejam najlepsza z opcji jakie udalo mi sie do tej pory wymyslec:

//Tablica ktora pobiera n znakow typu char, a potem je wypisuje w kolejnosci odwrotnej
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
char tab[100];
scanf("%d", &n);


for(int i=0; i!=n+1; i++)
{
tab[i]= getchar();
}
printf("%s\n", tab);

char tab_rev[100];
int j=0;
for(int i=n; i>0; i--)
{
    tab_rev[j]=tab[i-1];
    printf("%s", tab_rev);
}

A to wynik.

1 odpowiedź

+1 głos
odpowiedź 14 grudnia 2021 przez j23 Mędrzec (194,920 p.)
edycja 14 grudnia 2021 przez j23

Popraw na:

for(int i = n - 1, j = 0; i >= 0; --i, ++j) {
    tab_rev[j] = tab[i];
}

tab_rev[n] = 0;
printf("%s\n", tab_rev);

Napisz program w języku ANSI C, który pobierze od użytkownika liczbę naturalną n, a następnie do 100-elementowej tablicy typu char wpisze znaki podane przez użytkownika (...)

Fajnie, że autor tego zadania napisał, po co ta "liczba naturalna n". Nie żebym nie wiedział, o co chodzi, ale ktoś początkujący może mieć problem ze zrozumienie tak sformułowanego zadania.

komentarz 15 grudnia 2021 przez j23 Mędrzec (194,920 p.)
Nie wiem, czy to zgodne z założeniami zadania, ale liczba wczytanych znaków jest inna od zadeklarowanej, więc założyłem, że to błąd danych wejściowych, który powinien być zasygnalizowany przez program (vide ostatnie zdanie zadania).

Skoro to nie jest błąd, to zmień warunek w linii 16.
komentarz 15 grudnia 2021 przez Raven2221 Nowicjusz (200 p.)
Tylko na co mam go zmienic? Jak usune go calkowicie, to otrzymuje pusty wynik. Tak samo jak wpisze tam \n.
komentarz 15 grudnia 2021 przez j23 Mędrzec (194,920 p.)

Gdzie Ty chciałeś wpisać to \n?!

Zmień warunek na i > n. Autor zadania nie sprecyzował, kiedy program ma zwrócić BŁĄD, więc można sobie zgadywać, jak taki warunek powinien wyglądać.

komentarz 16 grudnia 2021 przez Raven2221 Nowicjusz (200 p.)

Dalej nie dziala.  Nie wyswietla sie nic. Problem jest z tym ze po wpisaniu liczby liter program domyslnie "wciska enter" i ten nieszczesny enter jest pierwszym odczytywanym znakiem zapisywanym w tablice. Czyli dla przykladu:

INPUT:
4  \n
ala

OUTPUT
\n
ala.

Jak chcialbym to rozpisac na poszczegolne elementy tablicy:

tab[0] = \n
tab[1] = a
tab[2]= l
tab[3]= a

Udalo mi sie to poprawic w poprzednim kodzie z uzyciem scanf'u cofajac po prostu indeks
poszczegolnych elementow tablicy w przypadku kiedy pierwszym elementem jest \n.
Wyszlo mniej wiecej tak

hipotetyczny tab[-1] = \n
tab[0] a
tab[1] l
tab[2] a

I ten sposob chociaz bardzo dziwaczny i pewnie grozacy bledem pamieci dziala - ale nie uwzglednia w ogole
bledow (cokolwiek ma byc bledem w tym zadaniu).

 

komentarz 16 grudnia 2021 przez j23 Mędrzec (194,920 p.)
#include <stdio.h>
#include <stdlib.h>
  
int main()
{
    char tab[100];
    char tab_rev[100 + 1];
    int n, c, i = 0;

    if(!fgets(tab, 100, stdin) || sscanf(tab, "%d", &n) != 1) {
        printf("BŁĄD\n");
        return -1;
    }

    while (i < 100 && (c = getchar()) != EOF && c != '\n') {
        tab[i++] = c; 
    }
      
    if (i > n) {
        printf("BŁĄD\n");
        return -1;
    }
    else n = i;
 
    for(int i = n - 1, j = 0; i >= 0; --i, ++j) {
        tab_rev[j] = tab[i];
    }
 
    tab_rev[n] = 0;
    printf("%s\n", tab_rev);
}

Powinno być ok.

Podobne pytania

0 głosów
3 odpowiedzi 657 wizyt
0 głosów
2 odpowiedzi 573 wizyt
pytanie zadane 19 stycznia 2018 w C i C++ przez nibyykto Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 1,318 wizyt
pytanie zadane 6 października 2015 w C i C++ przez Pscoolka Nowicjusz (240 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...