C - program nie dopełnia tablicy

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
przelacz
Piegowaty Guziec
Piegowaty Guziec
Posty: 13
Rejestracja: 03 gru 2011, 16:39
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

C - program nie dopełnia tablicy

Post autor: przelacz »

Witam,
Na ćwiczeniach z programowania strukturalnego, na których korzystamy z języka C mieliśmy zadanie:
W katalogu projektu utworzyć plik SQ.TXT i dołączyć go do projektu. Wzorując się na
odpowiednim przykładzie z dokumentu TYPY FUNKCJI napisać wersję A2 funkcji void
nawiasy (void) przekształcającej strumienie wg reguły:
strumień wejściowy: ab@@cdef:g;h%ijkdASt
strumień wyjściowy: ab[@][@]cdef[:]g[;]h[%]ijkd{A}{S}t
(funkcja wyprowadza strumień obejmując każdy znak nie będący literą nawiasami [] zaś
każdą dużą literę nawiasami klamrowymi {})
Napisałem program, który wygląda tak:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>

void nawiasy (void);
void nawiasyA2 (char a [], int n);
void nawiasyA2Test (void);
/**************************/
int main()
{
	nawiasy();
	return 0;
}
/**************************/
void nawiasyA2Test (void)
{
	#define MAX 20
	char tab [MAX];
	
	nawiasyA2 (tab, MAX);
	
	printf ("-----------------------------------\n"); // separator
	printf ("%sKONIEC",tab);
	putchar ('\n');
	
}
/**************************/
void nawiasyA2 (char a [], int n)
{
	int c;
	int i = 0;
	
	while ((c = getchar()) != EOF && i < n-1)
		if (c > 64 && c < 91)
		{
			a [i++] = '{';			//zamiast putchar ('(');
			if (i < n - 1)
				a [i++] = c;		//zamiast putchar (c);
			if (i < n - 1)
				a [i++] = '}';		//zamiast putchar ('}');
		}
		else if (c < 97 || c > 122)
		{
			a [i++] = '[';			// putchar ('[');
			if (i < n - 1)
				a [i++] = c;		// putchar (c);
			if (i < n - 1)
				a [i++] = ']';		// putchar (']');
		}
		else
			a [i++] = c;			// putchar (c);
	a [i] = '\0';

	
}
/**************************/
void nawiasy (void)
{
	int c;
	
	while ((c = getchar()) != EOF)
		if (c > 64 && c < 91)
		{
			putchar ('{');
			putchar (c);
			putchar ('}');
		}
		else if (c < 97 || c > 122)
		{
			putchar ('[');
			putchar (c);
			putchar (']');
		}
		else
			putchar (c);

}
Mój problem zaczyna się gdy ilość znaków przekracza 20 - powinno wydrukować znaków >= 20, lecz nie ma to żadnego wpływu. Program drukuje wszystkie wpisane znaki, nie zważając na pojemność tablicy. Czy ktoś bardziej doświadczony w tym języku byłby w stanie mi pomóc ?

Z góry dziękuję. :-)
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: C - program nie dopełnia tablicy

Post autor: beluosus »

Najwidoczniej nie nadpisujesz żadnych istotnych danych. Spróbuj wpisać 1000 znaków, w końcu zostanie nadpisany jakiś ważny fragment pamięci i program się wywali. C nie kontroluje rozmiaru tablic i praw zapisu do poszczególnych elementów. Nazwa tablicy to tylko wskaźnik na pierwszy element.
norvoles
Przebojowy Jelonek
Przebojowy Jelonek
Posty: 1113
Rejestracja: 04 sty 2008, 20:58
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Inne
Architektura: x86_64

Re: C - program nie dopełnia tablicy

Post autor: norvoles »

Może użyj właściwej funkcji?
Funkcja nawiasy() nie ma żadnego ograniczenia na liczbę wypisywanych znaków i w takiej postaci program działa prawidłowo ;)
kobylecki
Piegowaty Guziec
Piegowaty Guziec
Posty: 19
Rejestracja: 05 gru 2005, 18:11
Płeć: Mężczyzna
Wersja Ubuntu: 11.10
Środowisko graficzne: Unity
Architektura: x86

Re: C - program nie dopełnia tablicy

Post autor: kobylecki »

Po co funkcja nawiasyA2 przyjmuje tablicę znaków? Co ma robić ta funkcja? Czytać z wejścia, czy z tablicy, bo teraz wygląda jakby robila te dwie rzeczy na raz.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości