Wczytywanie ciągu za pomocą scanf
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 14 z 63.
Teraz, gdy rozumiesz, jak działają ciągi znaków z terminatorem null, czas nauczyć się pobierać ciągi znaków od użytkowników. Funkcja scanf może odczytywać ciągi znaków za pomocą specyfikatora formatu %s, ale ma istotne ograniczenia, które musisz poznać.
Aby wczytać ciąg znaków za pomocą scanf, użyj formatu %s i przekaż nazwę swojej tablicy znaków (bez operatora &, ponieważ nazwy tablic są już adresami):
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Jednak scanf("%s", ...) ma istotne ograniczenie: przestaje odczytywać, gdy tylko napotka biały znak (spację, tabulator lub znak nowej linii). Oznacza to, że jeśli użytkownik wpisze "Hello World", scanf przechwyci tylko "Hello", a "World" pozostawi w buforze wejściowym.
Kolejnym poważnym problemem jest to, że scanf nie sprawdza, czy dane wejściowe zmieszczą się w tablicy. Jeśli ktoś wpisze słowo dłuższe niż to, które może pomieścić tablica, dojdzie do przepełnienia bufora, co może spowodować awarię programu lub stworzyć luki w zabezpieczeniach. Zawsze upewnij się, że tablica znaków jest wystarczająco duża, aby pomieścić oczekiwane dane wejściowe.
Mimo tych ograniczeń scanf("%s", ...) doskonale nadaje się do odczytywania pojedynczych słów, czego właśnie poćwiczysz w nadchodzącym wyzwaniu.
Wyzwanie
ŁatwyNapisz program w C, który demonstruje odczytywanie danych wejściowych typu string od użytkownika za pomocą scanf i wyświetlanie ich. Twój program powinien:
- Zadeklarować tablicę znaków o nazwie
usernamez 30 elementami do przechowywania danych wprowadzonych przez użytkownika - Zadeklarować tablicę znaków o nazwie
hobbyz 25 elementami do przechowywania kolejnej wartości wejściowej - Użyć
printf, aby wyświetlić użytkownikowi komunikat "Enter your username:" - Użyć
scanfze specyfikatorem formatu%s, aby odczytać nazwę użytkownika do tablicyusername - Użyć
printf, aby wyświetlić użytkownikowi komunikat "Enter your hobby:" - Użyć
scanfze specyfikatorem formatu%s, aby odczytać hobby do tablicyhobby - Wyświetlić oba ciągi za pomocą
printfw dokładnym formacie pokazanym poniżej
Dane wejściowe zostaną podane jako dwa oddzielne pojedyncze słowa (bez spacji w obrębie każdego słowa).
Wynik powinien wyświetlać dane w następującym formacie:
Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!Na przykład, jeśli użytkownik poda "Alice" jako nazwę użytkownika i "reading" jako hobby, wynik powinien wyglądać następująco:
Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!To wyzwanie sprawdza, czy rozumiesz używanie scanf ze specyfikatorem formatu %s do odczytywania danych wejściowych typu string, prawidłowe deklarowanie tablic znaków o wystarczającym rozmiarze oraz łączenie danych wprowadzonych przez użytkownika ze sformatowanym wyjściem za pomocą printf.
Spróbuj swoich sił
#include <stdio.h>
int main() {
// TODO: Zadeklaruj tutaj tablice znaków
// TODO: Napisz tutaj kod, który wyświetli prośbę o dane i odczyta dane wejściowe
// TODO: Wyświetl komunikat końcowy
return 0;
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i sterowanie przepływem
1Podstawy wskaźników
Czym jest wskaźnik?Deklarowanie wskaźnikówOperator pobrania adresu (&)Operator dereferencji (*)Wskaźniki NULLPodsumowanie: podstawy wskaźników4Projekt: Proste narzędzie tekstowe
Przegląd projektuLiczenie znaków2Wskaźniki i tablice
Nazwy tablic jako wskaźnikiElementy tablic — wskaźnikiArytmetyka wskaźnikówPorównywanie wskaźnikówPodsumowanie: przechodzenie po tablicy za pomocą wskaźników5Wskaźniki i funkcje
Przekazywanie przez wartośćPrzekazywanie wskaźników do funkcjiModyfikowanie zmiennych za pomocą wskaźnikówKlasyczny przykład: zamianaPrzekazywanie tablic do funkcjiPowtórka: argumenty wskaźnikowe funkcji8Struktury i wskaźniki
Wskaźniki do strukturOperator strzałki (->)Przekazywanie struktur przez wartośćPrzekazywanie wskaźników do strukturDynamiczna alokacja strukturPodsumowanie: modyfikowanie struktury — wskaźnik11Końcowe zadania powtórkowe
Powtórka: dynamiczne łączenie ciągów znakówPowtórka: tablica strukturPowtórka: licznik częstotliwości słów3Tablice znaków i ciągi znaków
Ciągi znaków jako tablice charZnak końca ciąguWczytywanie ciągu za pomocą scanfUżywanie strlen()Używanie strcpy()Używanie strcat()Używanie strcmp()Podsumowanie: podstawowe funkcje do obsługi ciągów znakówPoćwicz samodzielnie: Kompilator C online