PDA

Prikaži potpunu verziju : mrtvi scanf ...


clzola
22.10.2011, 21:30
Jezik: C/C++
Ovako imam sledeci ulaz:

4

ab bc cd dz

az az az

ab bc cz ad de ef fz

ab bc cd de ef fg gz az bg cf



Prvi broj (4) oznacava broj ovih redova sa slovima. E sad ovo mora da bude ramaknuto ovim new line karakterima (\n) i naravno ja moram sam da znam kad je kraj reda..

uspjevam da napravim za sledeci input:

4
ab bc cd dz
az az az
ab bc cz ad de ef fz
ab bc cd de ef fg gz az bg cf


ali ne mogu da napravim sa ovim dodatnim novim redovima, program jednostavno puca jer kupi te '\n' karaktere..


int K; scanf("%c", &K);
getchar();

for(int i=0; i<K; i++) {
while(true)
{
scanf("%c%c%c", &first, &last, &ch);
// do smth with input
if(ch == '\n') break;
}

// Rest of the code
// and some calculations
// and the result.
}


Moram cak da unosim i ove razmake -.- da ne bi slucajno pokupio taj razmak i smjestio u promenljive first ili last ...

allokin
24.10.2011, 14:57
Ево како сам ја то решио:


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

#define putch(c) putc(c, stdout)

int main(int argc, char **argv)
{
int n, i, k;
char ***in, c;

scanf("%d", &n);
in = malloc(sizeof(char**) * n);

for(i = 0; i < n; ++i)
{
for(k = 0; ; ++k)
{
in[i] = realloc(in[i], sizeof(char*) * (k + 1));
in[i][k] = malloc(sizeof(char) * 3); // two chars + '\0'
scanf("%2s%c", in[i][k], &c);
if(c == '\n' || c == '\r')
{
in[i] = realloc(in[i], sizeof(char*) * (k + 2));
in[i][k+1] = NULL;
break;
}
}
}

printf("\n===== SHOULD BE THE SAME AS ABOVE =====\n\n%d\n", n);
for(i = 0; i < n; ++i)
{
putch('\n');
for(k = 0; in[i][k] != NULL; ++k)
printf("%s ", in[i][k]);
putch('\n');
}
putch('\n');

return EXIT_SUCCESS;
}



Нисам сигуран да ли је твој проблем са scanf() или можда са нечим другим.

clzola
24.10.2011, 16:30
program puca u samom startu :D

Ukucam 4 i odmah pukne.. :/

EDIT:
mogao bih da probam sa getline pa da posle toga prodjem krzo string trazeci ova slova, ali opet to je sve u redu za male test primjere, kad se vec pojavi ogromni test primjer ovo oduzima mnogo vremena... :/

allokin
24.10.2011, 16:41
test$ cat test3.c
#include <stdlib.h>
#include <stdio.h>

#define putch(c) putc(c, stdout)

int main(int argc, char **argv)
{
int n, i, k;
char ***in, c;

scanf("%d", &n);
in = malloc(sizeof(char**) * n);

for(i = 0; i < n; ++i)
{
for(k = 0; ; ++k)
{
in[i] = realloc(in[i], sizeof(char*) * (k + 1));
in[i][k] = malloc(sizeof(char) * 3); // two chars + '\0'
scanf("%2s%c", in[i][k], &c);
if(c == '\n' || c == '\r')
{
in[i] = realloc(in[i], sizeof(char*) * (k + 2));
in[i][k+1] = NULL;
break;
}
}
}

printf("\n===== SHOULD BE THE SAME AS ABOVE =====\n\n%d\n", n);
for(i = 0; i < n; ++i)
{
putch('\n');
for(k = 0; in[i][k] != NULL; ++k)
printf("%s ", in[i][k]);
putch('\n');
}
putch('\n');

return EXIT_SUCCESS;
}
test$ gcc -O2 -Wall test3.c -o test
test$ ./test
4

re gf hg ty

fd er

kl ui yt hj df vc sd ew tr

op kl gf df er

===== SHOULD BE THE SAME AS ABOVE =====

4

re gf hg ty

fd er

kl ui yt hj df vc sd ew tr

op kl gf df er

test$


Нешто је онда до платформе на којој си, јер овде све ради одлично.

clzola
24.10.2011, 19:38
probao sam pod Win7, al kad budem bio na Linux-u probacu i tamo ...