[C] Wypisanie stringa ze spacją

miszczyk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 14 lis 2010, o 21:00
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 4 razy

[C] Wypisanie stringa ze spacją

Post autor: miszczyk »

Z poprzednim problemem sobie poradziłem, teraz mam inne pytanko.

Czy da sie jakoś wpisując z klawiatury treść ze spacjami wczytać wyrazy po spacji do stringa, a następnie je wypisać?

Przykład:
mam

Kod: Zaznacz cały

 
char adres[30];
scanf("%s", adres);
wpisuje ul. mlotkowa 15

Printfując %s wyświetla mi tylko tekst wypisany do pierwszej spacji tj. ul., da sie to jakoś zmienić?

Kod: Zaznacz cały

printf("%s", adres)

Wynik: ul.

Z góry dzięki za odpowiedzi.
adambak
Użytkownik
Użytkownik
Posty: 1272
Rejestracja: 8 sty 2011, o 18:18
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 295 razy
Pomógł: 115 razy

[C] Wypisanie stringa ze spacją

Post autor: adambak »

scanf wczytuje tylko do białych znaków, jeśli chcesz wczytać całą linię to użyj gets
miszczyk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 14 lis 2010, o 21:00
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 4 razy

[C] Wypisanie stringa ze spacją

Post autor: miszczyk »

No właśnie użyłem getsa, tylko mam taki problem, że nie wczytuje mi nic przed pierwszą spacją, i musiałem wcześniej użyć scanfa, bo sam gets nie działał, wie ktoś jak to poprawić?

Kod: Zaznacz cały


#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#include <stdlib.h>

#define MAXSZER 78
#define MAXWYS 20

int main(void) 
{
	
	char imie[30];
	char nazwisko[30];
	char adres1[30];
	char adres2[30];
	
	char zawod[30];
	printf("Podaj swoje imie:\n");
	scanf("%s", &imie);
	printf("Podaj swoje nazwisko:\n");
	scanf("%s", &nazwisko);
	printf("Podaj swoj zawod:\n");
	scanf("%s", zawod);
	printf("Podaj swoj adres - ulica/mieszkanie:\n");
	scanf("%s", adres1);
	gets(adres1);
	printf("Podaj swoj adres - kod pocztowy/miasto:\n");
	scanf("%s", adres2);
	gets(adres2);
	
	
	
	
int szerokosc;
int wysokosc;
int linie;
int a;
int b;
int i;
int j;
for(wysokosc = 0 ; wysokosc <= MAXWYS ; wysokosc ++)
{
	if(wysokosc == 0 || wysokosc == MAXWYS/4 || wysokosc == MAXWYS/4 + MAXWYS/4 || wysokosc == MAXWYS - MAXWYS/4  || wysokosc == MAXWYS)
	{
for(szerokosc=0 ; szerokosc <= MAXSZER ; szerokosc++)
		{
	if(szerokosc == 0 || szerokosc == MAXSZER/3 || szerokosc == MAXSZER - (MAXSZER/3) || szerokosc == MAXSZER ) //rysowanie poziomych linii
		printf("+");
	else
	printf("-");
		}
	}
	else if(wysokosc == 1 || wysokosc == MAXWYS/4 + 1 || wysokosc == MAXWYS/4 + MAXWYS/4 + 1 || wysokosc == MAXWYS - MAXWYS/4 + 1) // warunek linii
		 // wysrodkowanie i wypisanie imienia i nazwiska
		{
			j = 0;
		while(j<3)
		{
		printf("|");
		if((strlen(imie)+strlen(nazwisko)+1)%2 == 0)   //Czy parzyste ze spacja
		{
	for(i=0;i <(MAXSZER/3/2) - ((strlen(imie)+strlen(nazwisko)+1)/2) - 1 ;i++)  // 1 z lewej
		printf(" ");
		printf("%s %s", imie, nazwisko);
	for(i=0;i <(MAXSZER/3/2) - ((strlen(imie)+strlen(nazwisko)+1)/2) ;i++)
		printf(" ");
		j++;
		}
		else
		{
	for(i=0;i <(MAXSZER/3/2) - ((strlen(imie)+strlen(nazwisko)+1)/2) - 1 ;i++) // 1 z lewej
		printf(" ");
	printf("%s %s", imie, nazwisko);
	for(i=0;i <(MAXSZER/3/2) - ((strlen(imie)+strlen(nazwisko)+1)/2) - 1 ;i++) // 1 z prawej
		printf(" ");
		j++;
		}
		}
		printf("|");
		
	}   // wysrodkowanie i wypisanie zawodu
	else if(wysokosc == 2 || wysokosc == MAXWYS/4 + 2 || wysokosc == MAXWYS/4 + MAXWYS/4 + 2 || wysokosc == MAXWYS - MAXWYS/4 + 2)
			{
			j = 0;
		while(j<3)
		{
		printf("|");
		if(strlen(zawod)%2 == 0)
		{
	for(i=0;i <(MAXSZER/3/2) - (strlen(zawod)/2) - 1 ;i++)
		printf(" ");
		printf("%s", zawod);
	for(i=0;i <(MAXSZER/3/2) - (strlen(zawod)/2) ;i++)
		printf(" ");
		j++;
		}
		else
		{
	for(i=0;i <(MAXSZER/3/2) - (strlen(zawod)/2) - 2 ;i++)
		printf(" ");
	printf("%s", zawod);
	for(i=0;i <(MAXSZER/3/2) - ((strlen(zawod)+1)/2) + 1 ;i++)
		printf(" ");
		j++;
		}
		}
		printf("|");
	}
		// wysrodkowanie i wypisanie adresu1		
    	else if(wysokosc == 3 || wysokosc == MAXWYS/4 + 3 || wysokosc == MAXWYS/4 + MAXWYS/4 + 3 || wysokosc == MAXWYS - MAXWYS/4 + 3)
			{
						// zliczamy ilosc znakow w ciagu:
				int licznik;
				licznik = 0;
				 for (a = 0; adres1[a] != '\0'; a++)
				 licznik++;
				
				j = 0;
				while(j<3)
		{
		printf("|");

		if(licznik%2 == 0)
		{
	for(i=0;i <(MAXSZER/3/2) - (licznik/2) - 1 ;i++)
		printf(" ");
		printf("%s",adres1);
	for(i=0;i <(MAXSZER/3/2) - (licznik/2) ;i++)
		printf(" ");
		j++;
		}
		else
		{
	for(i=0;i <(MAXSZER/3/2) - (licznik/2) - 2 ;i++)
		printf(" ");
		printf("%s",adres1);
	for(i=0;i <(MAXSZER/3/2) - ((licznik+1)/2) + 1 ;i++)
		printf(" ");
		j++;
		}
		}
		printf("|");
	}
	

		// wysrodkowanie i wypisanie adresu2		
    	else if(wysokosc == 4 || wysokosc == MAXWYS/4 + 4 || wysokosc == MAXWYS/4 + MAXWYS/4 + 4 || wysokosc == MAXWYS - MAXWYS/4 + 4)
			{
				// zliczamy ilosc znakow w ciagu:
				int licznik;
				licznik = 0;
				 for (b = 0; adres2[b] != '\0'; b++)
				 licznik++;
				
				j = 0;
				while(j<3)
		{
		printf("|");

		if(licznik%2 == 0)
		{
	for(i=0;i <(MAXSZER/3/2) - (licznik/2) - 1 ;i++)
		printf(" ");
		printf("%s",adres2);
	for(i=0;i <(MAXSZER/3/2) - (licznik/2) ;i++)
		printf(" ");
		j++;
		}
		else
		{
	for(i=0;i <(MAXSZER/3/2) - (licznik/2) - 2 ;i++)
		printf(" ");
		printf("%s",adres2);
	for(i=0;i <(MAXSZER/3/2) - ((licznik+1)/2) + 1 ;i++)
		printf(" ");
		j++;
		}
		}
		printf("|");
	}
			
			

			
			
	
printf("\n");

}
getchar();
getchar();
getchar();
getchar();
getchar();
getchar();

return 0;
}
Wszystko działa tylko jak zrobić, żeby wczytywało od pierwszego wyrazu?
adambak
Użytkownik
Użytkownik
Posty: 1272
Rejestracja: 8 sty 2011, o 18:18
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 295 razy
Pomógł: 115 razy

[C] Wypisanie stringa ze spacją

Post autor: adambak »

Kod: Zaznacz cały

  
   printf("Podaj swoj zawod:
");
   scanf("%s
", zawod);
   printf("Podaj swoj adres - ulica/mieszkanie:
");
   gets(adres1);
   printf("Podaj swoj adres - kod pocztowy/miasto:
");
   gets(adres2);
powinno pomóc.. chodzi o to, że po wpisaniu zawodu i wciśnięciu entera ten enter wciąż jest pamiętany, a że gets wczytuje do entera to się posypało bo pierwszy gets nie miał nic do wczytania.. rozwiązaniem jest użycie scanf z
na końcu jak powyżej, albo po scanf użycie getchar() aby pobrać ten zaległy enter, wtedy gets po tej instrukcji nie ma żadnych problemów, ponadto jak widać po użyciu getsa tego samego problemu z enterem nie ma..
miszczyk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 14 lis 2010, o 21:00
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 4 razy

[C] Wypisanie stringa ze spacją

Post autor: miszczyk »

Hmm, mi ani to ani to nie pomaga, dziwne..., u ciebie działało czy nie sprawdzałeś?

A no i trochę źle sformułowałem, drugi gets też nie czyta nic przed pierwszą spacją

EDIT:

Wstawiłem wszędzie putsy zamiast scanfow i zadziałało, dzięki za wskazówke!
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Wypisanie stringa ze spacją

Post autor: Afish »

gets to zło, dlatego został usunięty w C11, a w C++11 jest oznaczony jako deprecated. Użyj fgets albo gets_s (C11).
ODPOWIEDZ