logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C++. Program wyświetlający co drugi znak i wspak. SIGSEGV

Kostek7 03 Gru 2008 09:16 5104 5
REKLAMA
  • #1 5811822
    Kostek7
    Poziom 27  
    Posty: 1245
    Pomógł: 92
    Ocena: 61
    Pierwszy kod wyświetla co drugi znak:
    
    include <iostream>
    
    using namespace std;
    
    int main()
    {
    	while(!cin.eof())
    		{
    			char tablica[1000];
    			cin>>tablica;
    			char *p;
    			for(p=tablica;( (*p!=0)&&(*(p-1)!=0) );p+=2)
    				{
    					cout<<*p;
    				}
    			cout<<endl;
    		}
    	system("pause");
    	return 0;
    }

    Ten program wyświetla dane wejściowe wspak:
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    
    	char txt[1000];
    	char *p;
    	while(!cin.eof())
    	{
    		cin>>txt;
    		for(p=txt;*p!=0;p++){}
    		for(p=p-1;p>=txt;p--)
    			{
    				cout<<*p;	
    			}
    		cout<<endl;
    	}
    	system("pause");
    	return 0;
    }
    

    Na MS VS EE kompilują się, nie wywalają ostrzeżeń, i działają poprawnie. GGC na spoju wywala błąd SIGSEGV. Co do dziwnego wykonania to nie można stosować int,string.h, tylko wskaźniki na char.
    W pierwszym kodzie faktycznie warunek (*(p-1)!=0) wychodzi poza tablice ale jest on mi niezbędny do działania dla ciągów znaków o numerach nie parzystych. Nie wiem jak to poprawić.
  • REKLAMA
  • #2 5811895
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 5811929
    Kostek7
    Poziom 27  
    Posty: 1245
    Pomógł: 92
    Ocena: 61
    1. OK, a dokładniej ten błąd często związany jest z tablicą i przekroczeniem jej rozmiarów
    2. Tylko że odbieranie po znaku to chyba już tylko z for(i=0;i<1000;i++)
    a to int.
    3. Dane wejściowe while(!cin.eof()) czyli teoretycznie do Entera, ale nie za bardzo wiem jak to działa. Profesor podał ten warunek i mamy go wykorzystać.
  • REKLAMA
  • #4 5811967
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 5812243
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    Lepiej napisz pełną treść zadania, bo nie wiadomo, czy czegoś nie pominąłeś. Przede wszystkim nie wiadomo jaki jest rozmiar danych wejściowych, po drugie Twoje programy operują na liniach (a właściwie na słowach), a nie na całym tekście - tego nie ma w treści zadania.

    W obu programach użycie cin >> tablica jest błędem, program w takim przypadku pomija wszystkie białe znaki, wczytuje nie-białe znaki aż do napotkania kolejnego białego znaku lub końca danych wejściowych.

    W pierwszym programie wychodzisz poza tablicę, wystarczy "rozwinąć" pętlę i wykonać test w środku:
    for (p = txt; *p; p++)
    {
        // pomiń nieparzysty znak
        p++;
        // wypisz parzysty znak
        if (p)
            cout << *p;
        else
            break;
    }


    PS. Przenoszę do odpowiedniego działu.

    Pozdrawiam,
    Dr.Vee
  • #6 5814643
    Kostek7
    Poziom 27  
    Posty: 1245
    Pomógł: 92
    Ocena: 61
    Poprawne kody
    
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
                           char tablica[100010];
                           tablica[0]=1;
                           char *tablica2=tablica+1;
                           char *p;
    	while(cin>>tablica2)
    		{
    		   
    			for(p=tablica2;( (*p!=0)&&(*(p-1)!=0) );p+=2)
    				{
    					cout<<*p;
    				}
    			cout<<endl;
    		}
     
    	return 0;
    }    

    
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
     	char txt[100000];
    	char *p;
    	while(cin>>txt)
    	{
    		for(p=txt;*p!=0;p++){}
    		for(p=p-1;p>=txt;p--)
    			{
    				cout<<*p;	
    			}
    		cout<<endl;
    	}
    	return 0;
    } 
REKLAMA