Pewien warunek zwiazany z wczytywaniem slow (czysty C)

0

Witam,
Mam taki problem z dwoma zadaniami i nie bardzo wiem jak go rozwiazac.
Zadanie 1
Mamy zadeklarowaną tablicę znaków o określonym rozmiarze, do której musimy wstawić podany przez użytkownika napis. W jaki sposób to zrobić, aby program się nie wyłożył w przypadku podania przez użytkownika większego napisu, niż można zmieścić w tablicy?
Kod do zadania nr 1:

#include <stdio.h>
#include <string.h>
int main()
{
    char tablica[20];
    int length=0;
    printf("Prosze podac napis: ");
    scanf("%s", &tablica);
    length=strlen(tablica);
    if(length>20)
    {
        printf("Blad. Napis powinien miec maksymalnie 20 liter.");
    }
    else
    {
        printf("Podany napis to: %s", tablica);
    }
    return 0;
}

Problem: No i wlasnie jak zrobic, ze jak uzytkownik poda dluzszy wyraz powyzej 20 znakow to program wywala blad czy cos, bo tak jak ja zrobilem, to jest zle, bo nigdy scanf nie zapisze mi napisu do &tablica dluzszego niz 21 znakow, moim zdanime od razu po wpisaniu przez uzytkownika jakiegos slowa, program powinien sprawdzic ile te slowo ma znakow czy wiecej niz 21 czy mniej i jezeli ma mniej niz 21 to scanf, a jezeli wiecej to wyswietla komunikat, ale w jaki sposob to zrobic?
Zadanie nr 2:
Wczytać z klawiatury N napisów (N jest ustaloną wartością). Napisy mogą zawierać spacje. Ich maksymalna długość wynosi MAX. Napisy zapisać do pliku tekstowego o nazwie przechowywanej w zmiennej nazwa
Kod do zadania nr 2:

#include <stdio.h>
#include <string.h>
#define N 5
#define MAX 20
int main()
{
    int i;
    char tablica[N][MAX];
    for(i=0; i<N; i++)
    {
        printf("Prosze podac %d napis: ", i+1);
        fgets(tablica[i], MAX, stdin);
        fflush(stdin);
    }
    FILE *plik;
    plik = fopen("Plik_do_zadania_nr_2.txt", "w");
    if(plik==NULL)
    {
        printf("Blad.");
        return 1;
    }
    else
    {
        for(i=0; i<N; i++)
        {
            fprintf(plik, "%s", tablica[i]);
        }
    }
    fclose(plik);
    return 0;
}

Problem: Tutaj mam podobny problem, chodzi o to, ze jak uzytkownik podal jakies napisy i ilosc ich znakow przekracza "MAX" to zeby wyswietlil sie odpowiedni komunikat, a w pliku tekstowym po prostu w tym wierszu bylo puste pole lub odpowiedni komuniakt, ktos podpowie jak to zrobic?

2

Ad 1. Jeżeli chcesz pobierać cały wiersz i kontrolować czy użytkownik to polecam fgets - wczytuje razem z enterem.

fgets(tablica,100,stdin);
char *enter=strchr(tablica,'\n');
if(enter) *enter=0; // koniec napisu zamiast entera.
else printf("Podano zdecydowanie za dużo\n");

Ad 2. To pobierze nie więcej niż podano i na tym koniec:

scanf("%19s",tablica); // tablica, nie &tablica. Ewentualnie &tablica[20] - ale to pobierze jedno słowo.
scanf("%19[^\n]s",tablica); // to pobierze wiersz do entera.
0

W pierwszym zadaniu dodatkowo jest błąd.

scanf("%s", &tablica); 

powinno być

 scanf("%s", tablica);

Tu troszkę o tym problemie.

w drugim zadaniu będem jest

fflush(stdin);

stdina nie powinniśmy fluszować (pomijając, że może to nie zadziałać)...

1 użytkowników online, w tym zalogowanych: 0, gości: 1