Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Pomoc s programem v C

Ahoj,
potreboval bych poradit s jednim programem v C (všepřes komand lajnu).

1/Zadam nejaky text a ENTER
2/Program se zeptá na cele čislo od 1 do 9
3/Program najde shodne znaky nebo skupiny znaku, ktere se opakuji a nahradi je jednim a před ten znak vloží číslo,kolikrat jich nahradil
4/Vytiskne na obrazovku vysledek

Př.
Vstup: blblbl blabla pro hodnotu 2
Výstup: 2bl blabla

Vstup: blblbl blabla pro hodnotu 3
Výstup: blblbl 1bla

atd...

Vstup: blblbl blabla pro hodnotu 2
Výstup: 2bl blabla

POPŘ.
Vynechat Bod 2 a konttrolovalo by mi to bloky třeba do po sobe 9 jdoucich znacich
Vstup: blblbl blabla pro hodnotu 2
Výstup: 2bl 1bla

atd...

Moje řešení bohužel moc nefunguje, snažil jsem se na něco přijit zknihy Programovací jazyk C, ale nahrazuje mito jen stejne sznakyposobe jednim např(vstup aaa vystup a)

Mnohokrát děkuji

Předmět Autor Datum
A kde máš svůj kód?
Wikan 01.11.2010 17:18
Wikan
Tohle jse stvořil s pomoci knihy a internetu #include <stdio.h> #include<string.h> char *data="Vstu…
PetrP 01.11.2010 17:19
PetrP
Pozor, keby si mal v premennej buf reťazec obsahujúci znak '%', tak to nedopadne dobre. Ak chceš vyp…
los 01.11.2010 19:22
los
Budeš mať 2 smerníky - jeden do vstupného reťazca a druhý do výstupného reťazca. Najprv skontroluješ…
los 01.11.2010 19:17
los
Mockrát díky :beer:, ještě si to předělám, abychto mohl spouštět pomocíparametrů přes command lajnu.…
PetrP 01.11.2010 20:50
PetrP
Nie je ošetrené pretečenie pri zapisovaní do výstupného reťazca: #include <stdio.h> #include <strin…
los 01.11.2010 21:47
los
Díky, mohl by jsi mi ještě pomoci, s těmi parametry... ted s tim zapasim.... Takhle byto vypadalo p…
PetrP 01.11.2010 22:22
PetrP
A čo konkrétne ti nejde s parametrami? Test, či argc == 2 alebo nepoznáš funkciu atoi?
los 01.11.2010 22:29
los
No, já si myslel, že to napíšu nejak takto : int main(int argc, char* argv[]) { char input[MAX], ou…
PetrP 01.11.2010 22:54
PetrP
V argc máš uložený počet parametrov, v argv ich hodnoty. Na prvej pozícii (s indexom 0) je spúšťaný…
los 01.11.2010 23:13
los
Tak čísla mi funguji přes parametry ok, ale vystup mi nějak zlobí Takhle jsem to pozměnil char *i…
PetrP 02.11.2010 00:30
PetrP
char *input, output[MAX]; input = argv[3]; (Trojka tam má být, přidal sem ještě jeden parametr) prin…
PetrP 02.11.2010 00:41
PetrP
Nechce sa mi to tu citat cele ale ked programator nevi kde je chyba, tak si to zdebuguje (odkrokuj s…
MM.. 02.11.2010 18:03
MM..
n = argv[1]; je hovadina. Kto za teba ma previest string na integer? pouzi atoi. když si vytisknu…
MM.. 02.11.2010 18:10
MM..
Vycházím z toho (spuštěno s parametry: 3 blablabla): #include <stdio.h> #include <string.h> #define…
PetrP 02.11.2010 18:59
PetrP
na vystupu vyjede h ked ten program spustis s jakymi parametrami? (opis sem presne do bodky commadli…
MM.. 02.11.2010 19:10
MM..
Inac problem tam mas ten, ze in = input je pred input = argv[2]; co je samozrejme zle, in=input musi…
MM.. 02.11.2010 19:13
MM..
Díky moc, opravdu je to tímto: Inac problem tam mas ten, ze in = input je pred input = argv[2]; co…
PetrP 02.11.2010 19:20
PetrP
to si nemal celu definiciu *in a *out dat za to, len priradenie in=input. idealne ked premennu input…
MM.. 02.11.2010 19:41
MM..
Díky všem zučastněnym za pomoc, považujte to tedy za vyřešené, dík moc :beer: poslední
PetrP 02.11.2010 19:49
PetrP

Tohle jse stvořil s pomoci knihy a internetu

#include <stdio.h>
#include<string.h>

char *data="Vstupnii teeext";

void Vstup(char *a)
{ for(;*a;a++)
    if(*(a+1)==*a)
    {  memmove(a,a+1,strlen(a));
       a--;
    }
}
int main(int argc, char* argv[])
{
   char buf[4096];
   strcpy(buf,data);
   printf(buf);
   printf("\n======================\n");
   Vstup(buf);
   printf(buf);
   return 0;
}

Výstup mi vyjde: Vstupni text

Stačilo b, kdyby mi někdo pomohl udělat následující:

Text by se zadával přimo z příkazové řádky
a program by ještě před nahrazené znaky dal číslo, kolik jich nahradil...

Aby byl výstup: Vstupn1i t2ext

Pozor, keby si mal v premennej buf reťazec obsahujúci znak '%', tak to nedopadne dobre. Ak chceš vypisovať hocičo pomocou printf, tak formátovací reťazec by prakticky nikdy nemal byť vstupom od používateľa. Čiže by to malo vyzerať takto:

printf("%s", buf);

V tvojom prípade by bola vhodnejšia funkcia puts, ktorá na koniec vypisovaného reťazca pridá aj znak pre nový riadok.

Budeš mať 2 smerníky - jeden do vstupného reťazca a druhý do výstupného reťazca. Najprv skontroluješ, či sú na vstupe opakujúce sa skupiny znakov. Ak áno, tak si zvýšiš interné počítadlo a posunieš sa na vstupe o tú skupinu znakov ďalej. Ak nie, tak prekopíruješ znak zo vstupu na výstup a posunieš oba smerníky o jeden znak ďalej. Predtým ale nezabudneš vypísať počet v internom počítadle (a vynulovať ho), ak je nenulové.

#include <stdio.h>
#include <string.h>
#define MAX 4096

int main(int argc, char* argv[])
{
	char input[MAX], output[MAX];
	int n, cnt = 0;
	char *in = input, *out = output, *end;
	printf("Zadajte retazec: ");
	fgets(input, MAX, stdin);
	printf("Zadajte cislo 1-9: ");
	while (scanf("%d", &n) != 1);
	end = in + strlen(input);
	while (in <= end) {
		if (in <= end - 2 * n && strncmp(in, in + n, n) == 0) {
			++cnt;
			in += n;
			continue;
		}
		if (cnt) {
			out += sprintf(out, "%d", cnt);
			cnt = 0;
		}
		*out++ = *in++;
	}
	puts(output);
	return 0;
}

Mockrát díky :beer:, ještě si to předělám, abychto mohl spouštět pomocíparametrů přes command lajnu.

Mohl bysmiještě poradit nebo aspoň naznačit, jak udělat reverzní program, po zadání té délky skupiny znaků např. "2", aby to zase z textu např "4au" udělalo zpět "auauauauau" ? Díky moc

Nie je ošetrené pretečenie pri zapisovaní do výstupného reťazca:

#include <stdio.h>
#include <string.h>
#define MAX 4096

int main(int argc, char* argv[])
{
	char input[MAX], output[MAX];
	int n, cnt = 0, i;
	char *in = input, *out = output, *end;
	printf("Zadajte retazec: ");
	fgets(input, MAX, stdin);
	printf("Zadajte cislo 1-9: ");
	while (scanf("%d", &n) != 1);
	end = in + strlen(input);
	while (in <= end) {
		if (*in >= '0' && *in <= '9') {
			cnt += cnt * 10 + *in++ - '0';
			continue;
		}
		if (cnt) {
			if (in <= end - n) {
				while (--cnt > 0)
					for (i = 0; i < n; ++i)
						*out++ = *(in + i);
			} else {
				out += sprintf(out, "%d", cnt);
				cnt = 0;
			}
		}
		*out++ = *in++;
	}
	puts(output);
	return 0;
}

No, já si myslel, že to napíšu nejak takto :

int main(int argc, char* argv[])
{
	char input[MAX], output[MAX];
	int n, cnt = 0;
	char *in = input, *out = output, *end;
	printf("Zadajte retazec: ");
	fgets(input, MAX, stdin);
	n = argv[1];
	end = in + strlen(input);
.
.
.

Což mi bohužel nenačte, přitom, když si vytisknu promennou n, tak mihodnota sedi, co sem zadal pres parametr a k nacitani retezce pres parametr jsem se vubec nedostal (omlouvam se, ale s C teprve zacinam)

V argc máš uložený počet parametrov, v argv ich hodnoty. Na prvej pozícii (s indexom 0) je spúšťaný program. na ďalších sú samotné parametre.

Takže najprv skontroluješ, či máš správny počet parametrov a prípadne vypíšeš rozumné hlásenie:

if (argc != 3) {
	puts("Nespravny pocet parametrov.");
	return 1;
}

Z argumentov vytiahneš hodnoty, pričom na konverziu z reťazca do čísla použiješ funkciu atoi:

n = atoi(argv[1]);
input = argv[2];

(Input bude tým pádom deklarovaný ako char *input namiesto char input[MAX].)

Tak čísla mi funguji přes parametry ok, ale vystup mi nějak zlobí

Takhle jsem to pozměnil

            char *input, output[MAX];               //char input[MAX], output[MAX];
            input = argv[3];                             // fgets(input, MAX, stdin);

Ale na vystup mi to vždy vypíše " h ("

Nechce sa mi to tu citat cele ale ked programator nevi kde je chyba, tak si to zdebuguje (odkrokuj si program riadok po riadku a sleduj premenne). Debugger ma kazde vyvojove prostredie tak sa to konecne nauc pouzivat (menu start debugging, a nastav si tam aj niekde parametre prikazoveho riadku).

n = argv[1];

je hovadina. Kto za teba ma previest string na integer? pouzi atoi.

když si vytisknu promennou n, tak mihodnota sedi

Nesedi. Skus pochopit rozdiel medzi znakom (stringu) a cislom. Na to je dobre vediet co to je ASCII tabulka, www.google.com. Aby si vedel ze znak "1" nema hodnotu 1, ale 49.

A ked chces nejaku radu tak sem musis skopirovat kompletny program a napisat co to robi zle.

Vycházím z toho (spuštěno s parametry: 3 blablabla):

#include <stdio.h>
#include <string.h>
#define MAX 4096

int main(int argc, char* argv[])
{
	char input[MAX], output[MAX];
	int n, cnt = 0;
	char *in = input, *out = output, *end;
	printf("Zadajte retazec: ");
	fgets(input, MAX, stdin);
    n = atoi(argv[1]);
	end = in + strlen(input);
	while (in <= end) {
		if (in <= end - 2 * n && strncmp(in, in + n, n) == 0) {
			++cnt;
			in += n;
			continue;
		}
		if (cnt) {
			out += sprintf(out, "%d", cnt);
			cnt = 0;
		}
		*out++ = *in++;
	}
	puts(output);
	return 0;
	}

Ale chci vkládat řetězec parametrem, tak udělám toto (tučné řádky změněny a opět spuštěno s parametry 3 blablabla):

#include <stdio.h>
#include <string.h>
#define MAX 4096

int main(int argc, char* argv[])
{
	[b]char *input, output[MAX];[/b]
	int n, cnt = 0;
	char *in = input, *out = output, *end;
	[b]input = argv[2];[/b]
        n = atoi(argv[1]);
	end = in + strlen(input);
	while (in <= end) {
		if (in <= end - 2 * n && strncmp(in, in + n, n) == 0) {
			++cnt;
			in += n;
			continue;
		}
		if (cnt) {
			out += sprintf(out, "%d", cnt);
			cnt = 0;
		}
		*out++ = *in++;
	}
	puts(output);
	return 0;
	}

a na vástupu mi vyjde "h (" místo "2bla"

Díky moc, opravdu je to tímto:

Inac problem tam mas ten, ze
in = input
je pred
input = argv[2];
co je samozrejme zle, in=input musi byt az potom.

#include <stdio.h>
#include <string.h>
#define MAX 4096

int main(int argc, char* argv[])
{
	char *input, output[MAX];
	int n, cnt = 0;
	input = argv[2];
	char *in = input, *out = output, *end;

    n = atoi(argv[1]);
	end = in + strlen(input);
	while (in <= end) {
		if (in <= end - 2 * n && strncmp(in, in + n, n) == 0) {
			++cnt;
			in += n;
			continue;
		}
		if (cnt) {
			out += sprintf(out, "%d", cnt);
			cnt = 0;
		}
		*out++ = *in++;
	}
	puts(output);
	return 0;
	}

Jestli bych mohl poprosit ještě o jednu věc, potřeboval bych poradit jak (okomentovat), jednotlivé řádky programu, nemyslím to, jak se dělají komentáře, ale obsah koméntáře, aby to bylo srozumitelné i pro neznalé programování? Prože absolutne nevim, jak nejake veci popsat, aby to otec, který se chce učit programovat pochopil...

to si nemal celu definiciu *in a *out dat za to, len priradenie in=input. idealne ked premennu input uplne vyhodis, je pouzita predsa len raz a to zmenis na in. To co mas neni konformne s ANSI C.
A mas tam dat aj kontrolu na pocet parametrov.

int main(int argc, char* argv[])
{
	char output[MAX];
	int n, cnt = 0;
	char *in, *out = output, *end;

    if(argc!=3) {printf("Nespravne parametre!\n"); exit(1); }

    n = atoi(argv[1]);
    in = argv[2];
	end = in + strlen(in);
	while (in <= end) {
		if (in <= end - 2 * n && strncmp(in, in + n, n) == 0) {
			++cnt;
			in += n;
			continue;
		}
		if (cnt) {
			out += sprintf(out, "%d", cnt);
			cnt = 0;
		}
		*out++ = *in++;
	}
	puts(output);
	return 0;
	}

Pri vystupe by sa hodila aj kontrola na MAX, ale to sa mi robit nechce.

Kometnar moze robit len ten kto ten program chape. A potom nema problem urobit komentar. Takze si spusti google.com a pochop co robi kazdy riadok a potom mozes okomentovat kazdy riadok.
P.S. komentar by mal obsahovat len to co NENI v kode. T.j. ak mam kod in=argv[2] tak je hovadina pisat komentar "priradime argv[2] do in" ptz to predsa kazdy vidi z kodu, ale komentar na tomto mieste moze obsahovat ze preco potrebujem vobec nejake in, t.j. napr. komentar by tam bol "priprava startovacieho pointra pre hladanie zhody stringov" apod. Ako pisem musis to najprv CHAPAT ze preco tam je kazdy riadok a preco by to neslo bez neho.

Zpět do poradny Odpovědět na původní otázku Nahoru