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

Programowanie C wizytówka problem scanf

VPS Starter Arubacloud
0 głosów
1,601 wizyt
pytanie zadane 26 maja 2017 w C i C++ przez Kuba2263 Nowicjusz (200 p.)

Dopiero zaczynam swoją przygodę z programowaniem i zaczynam naprawdę od prostych rzeczy, dlatego proszę o wyrozumiałość. Chciałbym zapytać dlaczego we wprowadzaniu danych scanfem np zmiennej imie po zatwierdzeniu enterem od razu kończy mi program , bez wprowadzania kolejnych danych np ulicy itd.

Program ma na celu wygenerowanie wizytówki na podstawie wprowadzonych przez nas danych otoczonej wybranym przez nas dowolnym znakiem ( nie jest jeszcze dokończony):

#include <stdio.h>

int main()
{
    char imie,ulica,numer_domu,numer_lokalu,kod_pocztowy,miasto,rodzaj_studiow, kierunek,rok,semestr,znak;
    printf("Podaj swoje imie i nazwisko:\n");
    scanf("%c",&imie);
    printf("Podaj swoj adres zamieszakania,tj. nazwe ulicy ,numer domu, numer lokalu, kod pocztowy i miasto(kazda wprowadzona dana zatwierdź enterem):\n");
    scanf("%c",&ulica);
    scanf("%c",&numer_domu);
    scanf("%c",&numer_lokalu);
    scanf("%c",&kod_pocztowy);
    scanf("%c",&miasto);
    printf("Podaj rodzaj studiów (dzienne/zaoczne):\n");
    scanf("%c",&rodzaj_studiow);
    printf("Podaj Kierunek studiów:");
    scanf("%c",&kierunek);
    printf("Podaj Rok i semestr studiów(kazda wprowadzona dana zatwierdź enterem):\n");
    scanf("%c",&rok);
    scanf("%c",&semestr);
    
    printf("Wprowadz znak jakim chcesz otoczyć ramke:\n");
    scanf("%c",&znak);
    
    printf("Oto Twoja wizytowka:\n");
    
    printf("%c %c %c\n",znak,imie,znak);
    
    return 0;

}

4 odpowiedzi

+1 głos
odpowiedź 26 maja 2017 przez Żyrosławw Bywalec (2,300 p.)
Po pierwsze używasz zmiennej char do przechowywania danych. Jest ona w stanie pomieścić max jeden znak.

Użyj char[] - tablicy znaków, a następnie zamiast w scanf("%c",&imie); - wczytywać pojedyńczego znaku wczytaj cały ciąg (%s zamiast %c).
0 głosów
odpowiedź 26 maja 2017 przez Kuba2263 Nowicjusz (200 p.)

O to mi chodziło jest już w porządku , dziękuje Wam bardzo ! Mam jeszcze jedno pytanie dotyczące małego kruczka. Zauważyłem, że gdy wprowadzam np. kierunek studiów ze spacja dla przykładu "Automatyka Budynkowa" to następnie mogę wprowadzić rok , ale automatycznie pomija mi wprowadzenie semestru. Czy mógłby mi ktoś wytłumaczyć skąd bierze się taki problem i jak go rozwiązać? 

Program:

#include <stdio.h>
int main() 

    char imie[100],nazwisko[100],ulica[100],numer_domu[3],numer_lokalu[3],kod_pocztowy[10],miasto[30],rodzaj_studiow[100], kierunek[100],rok[4],semestr[2],znak[1]; 
    printf("Podaj swoje imie:\n");
    scanf("%s",&imie); 
    printf("Podaj swoje nazwisko\n");
    scanf("%s",&nazwisko); 
    printf("Podaj swoj adres zamieszakania,tj. nazwe ulicy ,numer domu, numer lokalu, kod pocztowy i miasto(kazda wprowadzona dana zatwierdź enterem):\n"); 
    scanf("%s",&ulica); 
    scanf("%s",&numer_domu); 
    scanf("%s",&numer_lokalu); 
    scanf("%s",&kod_pocztowy); 
    scanf("%s",&miasto); 
    printf("Podaj rodzaj studiow (dzienne/zaoczne):\n"); 
    scanf("%s",&rodzaj_studiow); 
    printf("Podaj Kierunek studiow:"); 
    scanf("%s",&kierunek); 
    printf("Podaj Rok i semestr studiow(kazda wprowadzona dana zatwierdź enterem):\n"); 
    scanf("%s",&rok); 
    scanf("%s",&semestr); 
     
    printf("Wprowadz znak jakim chcesz otoczyc ramke:\n"); 
    scanf("%s",&znak); 
     
    printf("Oto Twoja wizytowka:\n"); 
     
    printf("%s %s %s\n",znak,imie,znak); 
    printf("%s %s %s",znak,ulica,znak);
     
    return 0;
}

 

komentarz 26 maja 2017 przez Bondrusiek Maniak (61,370 p.)

Cześć,

funkcja scanf()  nie czyta białych znaków tzn. ,że "Automatyka Budynkowa"  to dwa różne ciągi znaków. Pierwszy to "Automatyka" drugi to "Budynkowa". Można to ominąć stosując gets() zamiast scanf()

Przykład gets() :

#include <stdio.h>

int main()
{
   char str[50];
   //Wpisz tu sobie "automatyka budowlana"
   printf("Enter a string : ");
   gets(str);

   printf("You entered: %s", str);

   return(0);
}

 

komentarz 26 maja 2017 przez NaviFox Dyskutant (8,950 p.)

Przy gets() może dostać ostrzeżenie, lepiej użyć fgets().

#include <stdio.h>
 
char * get _string(char * str, int n); /*funkcja do pomijania znaku nowej linii*/
int main()
{
   char str[50];
   //Wpisz tu sobie "automatyka budowlana"
   printf("Enter a string : ");
   get_string(str, 50);
 
   printf("You entered: %s", str);
 
   return(0);
}

char * get_string(char * str, int n){
  char * res;
  res = fgets(str, n, stdin);
  while(*str != '\0'){
    if(*str == '\n'){
      *str='\0';
      break;
    }
    str++;
  }
  return res;
}

 

0 głosów
odpowiedź 26 maja 2017 przez Kuba2263 Nowicjusz (200 p.)

Ooo teraz wszystko pięknie działa. Dziękuje za pomoc ! smiley

–1 głos
odpowiedź 26 maja 2017 przez Deloryn Bywalec (2,060 p.)
Spróbuj zamiast scanf("%c",&imie);  dać scanf("%s",&imie);
komentarz 26 maja 2017 przez j23 Mędrzec (194,920 p.)
edycja 26 maja 2017 przez j23

@Deloryn, imie to zmienna char, jak zrobi tak, jak proponujesz, to będzie "pisać po stosie" i katastrofa gotowa.

 

Jeśli już, to tak:

char imie[100];

scanf("%s",imie);

 

Podobne pytania

0 głosów
2 odpowiedzi 567 wizyt
pytanie zadane 10 grudnia 2016 w C i C++ przez Jan Dobrakowski Użytkownik (580 p.)
0 głosów
1 odpowiedź 312 wizyt
pytanie zadane 9 czerwca 2021 w C i C++ przez warzywko13 Użytkownik (840 p.)
0 głosów
1 odpowiedź 627 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 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!

...