Dyskusja:C/Podstawowe procedury wejścia i wyjścia
Ogólny zarys
edytujMoże mi ktoś rozjaśnić jaki jest ogólny zamysł tego rozdziału? Tzn. co ma być w nim opisane? Bo tak na dobrą sprawę, żeby opisać operacje I/O trzeba znać struktury sterujące. Przykładowo przy scanf() należy sprawdzać ile argumentów zostało poprawnie wczytanych. Przy getchar() należy sprawdzać czy nie nastąpił już koniec danych (EOF) itp. --Mina86
- Opis prostych funkcji czytania z klawiatury i pisania na ekran. Bez zawracania czytelnikowi głowy plikami, czym tak naprawdę są napisy i wymagania wiedzy o wskaźnikach.
- Co do instrukcji sterujących - zobacz sobie do tamtego rozdziału, jak byś sobie poradził tam bez wyjaśnienia, jak działa scanf() i printf()? --Derbeth talk 23:58, 6 sty 2007 (CET)
- Żeby wyjaśnić działanie instrukcji sterujących potrzebny jest jedynie printf("%d\n", i); (tzn. można tłumaczyć i bez tego, ale z tym pewnie będzie wygodniej), gdy tymczasem do wyjaśnienia scanf() potrzebne jest if lub while, do wyjaśnienia getchar() potrzebny jest while. --Mina86
Hm, jeśli obiecasz, że jesteś w stanie nie zmieniając zbytnio treści rozdziału o instrukcjach sterujących dostosować go do nowego układu treści - to jestem na tak. Układ wtedy wyglądałby tak: Zmienne - Podstawowe operacje matematyczne - Instrukcje sterujące - We/wy. Tylko warunek - sam dostosowujesz rozdziały tak, by całość trzymała się kupy. --Derbeth talk 16:26, 7 sty 2007 (CET)
Szerokość pola w %s
edytujKtoś trochę przesadził w opisie użycia: Na chwilę obecną musisz zapamiętać, żeby zaraz po znaku procentu podawać maksymalną liczbę znaków, które może przechować bufor, czyli liczbę o jeden mniejszą, niż rozmiar tablicy. Bezpieczna wersją powyższego kodu jest Maksymalna liczba znaków, które można przechować w tablicy, jest równa rozmiarowi tablicy a nie o jeden mniejsza. Powinno być więc poniżej: scanf("%100s", tablica);--Bodkin 23:00, 17 sty 2007 (CET)
- A miejsce na nulla? --Derbeth talk 23:01, 17 sty 2007 (CET)
- Też się nad tym nullem w pierwszej chwili zastanawiałem, ale spróbowałem w realu i nie jest potrzebne miejsce na niego. Przynajmniej jak używam LCC. Spróbuj na innych kompilatorach, może to od tego zależy? --Bodkin 22:27, 24 sty 2007 (CET)
- W rozdziale C/Napisy znajdziesz, co stanie się, gdy spróbujesz sprawdzić długość takiego napisu funkcją strlen(). --Derbeth talk 23:34, 24 sty 2007 (CET)
- Za 3 godziny mam egzamin więc teraz raczej tego Ci nie znajdę, ale jak wrócę to wyszukam odpowiedni fragment standardu i wkleje. Natenczas musi Ci wystarczyć wyciąg z man scanf:
- An optional decimal integer which specifies the maximum field width. Reading of characters stops either when this maximum is reached or when a non-matching character is found, whichever happens first. Most conversions discard initial whitespace characters (the exceptions are noted below), and these discarded characters don't count towards the maximum field width. String input conversions store a null terminator ('\0') to mark the end of the input; the maximum field width does not include this terminator.
- Za 3 godziny mam egzamin więc teraz raczej tego Ci nie znajdę, ale jak wrócę to wyszukam odpowiedni fragment standardu i wkleje. Natenczas musi Ci wystarczyć wyciąg z man scanf:
- Wyciąg z ISO/IEC 9989:1999 sekcja 7.19.6.2 The fscanf function (podkreślenie pochodzi ode mnie):
- [12] s Matches a sequence of non-white-space characters. If no l length modifier is present, the corresponding argument shall be a pointer to the initial element of a character array large enough to accept the sequence and a terminating null character, which will be added automatically.
- [19] To accept repeatedly from stdin a quantity, a unit of measure, and an item name:
- Wyciąg z ISO/IEC 9989:1999 sekcja 7.19.6.2 The fscanf function (podkreślenie pochodzi ode mnie):
#include <stdio.h> /* ... */ int count; float quant; char units[21], item[21]; do { count = fscanf(stdin, "%f%20s of %20s", &quant, units, item); fscanf(stdin,"%*[^\n]"); } while (!feof(stdin) && !ferror(stdin));
- I jeszcze mały teścik: O ile Cię dobrze rozumiem to poniższy kod:
#include <stdio.h> int main(void) { char str[5]; sscanf("012345", "%5s", str); puts(str); return 0; }
- powinien wypisać 0123, ale wypisuje 01234 (tzn. tak naprawdę może stać się cokolwiek, bo nie jest on zgodny ze standardem i uruchamia undefined behaviour). Jeżeli natomiast twierdzisz, że w tablicy 5 znaków można zmieścić ciąg o długości 5 znaków to zapominasz, że w tablicy na końcu łańcucha musi być jeszcze zapisany znak null. -- mina86 (talk) 14:33, 25 sty 2007 (CET)