• 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

0 głosów
1,061 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 (60,670 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,970 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 (163,540 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 263 wizyt
pytanie zadane 10 grudnia 2016 w C i C++ przez Jan Dobrakowski Użytkownik (580 p.)
0 głosów
1 odpowiedź 45 wizyt
pytanie zadane 9 czerwca w C i C++ przez warzywko13 Użytkownik (740 p.)
0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

84,132 zapytań

132,902 odpowiedzi

293,920 komentarzy

55,556 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...