Witam.
Banalny program z pętla for i fgets
Dlaczego przeskakuje do 'nazwy 2' wie ktoś oto kod:
http://pastebin.com/44VP1cEQ
bo scanf() wczyta ci tylko liczbę z znak \n zostawi w buforze. fgets() ten znak zje i przeskoczy do kolejnej iteracji
Dzięki kolego na śmierc zapomnialem o znaku zerowym.
Dobra napisalem cos takiego ale nie dziala. Może ktoś pomóc z tym '\0'? Bo juz mi ręce opadaja :/
#include <stdio.h>
#include <string.h>
#define MAX 81
int main()
{
int ile;
char licznik;
char *TabNazw[MAX];
char *rem;
printf("Podaj liczbe: ");
scanf("%d", &ile);
if (ile == 0)
{
printf("Podales zero.\n");
system("pause");
return 0;
}
else
for(licznik = 0; licznik < ile; licznik++)
{
printf("Podaj nazwe %d: ", licznik+1);
fgets(TabNazw,MAX,stdin);
for(rem = TabNazw; *rem != '\0' && *rem != '\n'; rem++)
*rem = '\0';
}
system("pause");
return 0;
}
To jest w ogóle źle napisane. Próbujesz tu coś wczytywać do char* na który nie zaalokowałeś pamięci. WTF? Na oko to powinno być jakoś tak:
#include <stdio.h>
#include <string.h>
#define MAX 81
int main()
{
int ile;
char licznik;
char TabNazw[MAX][MAX];
char *rem;
printf("Podaj liczbe: ");
scanf("%d ", &ile);
if (ile == 0)
{
printf("Podales zero.\n");
return 0;
}
else
{
for(licznik = 0; licznik < ile; licznik++)
{
printf("Podaj nazwe %d: ", licznik+1);
fgets(&(TabNazw[licznik][0]),MAX,stdin);
for(rem = &(TabNazw[licznik][0]); *rem != '\0' && *rem != '\n'; rem++)
*rem = '\0';
printf("Wczytano %s",TabNazw[licznik]);
}
}
return 0;
}
To Ci w ogóle działa? U mnie tylko pyta o 'ile' i jak wpiszę jakakolwiek liczbę kursor idzie linijke niżej i tylko mruga. :/
EDIT: ok znalazłem przyczynę, dzięki. (ale i tak zasrany '\0' przeskakuje.)
Tak z ciekawości, gdzie wyczytałeś, że problemem jest znak '\0'?
Ten wewnętrzny for jest kompletnie bez sensu - czyścisz to co wprowadziłeś.
Zaraz za tym
scanf("%d", &ile);
daj fgets(TabNazw[0], MAX, stdin);
Wiem, że jest bez sensu ponieważ nie działa ;]
A odpowiadając na Twoje pytanie znak '\0' jest na 100% przyczyna powstawania błędu. chodzi o różnicę w pobieraniu danych przez scanf() i fgets(), jest o tym w sieci w cholere. Ale każdy z podawanych przykładów (jak to ominąć) jest tylko obchodzeniem problemu. Tak naprawde powinienem użyć fputs i fgets (wtedy jest ok. Ale dano mi takie powalone zadanie, że mam użyć scanf.
Problemem nie jest znak '\0' tylko zostający po scanf znak '\n' i być może '\r'. Jednym z rozwiązań tego problemu jest to co Ci wyżej napisałem - po prostu wczytanie tych znaków.
Właśnie czytałem, że to chyba '\n'
Kurde proste i genialne, dzięki wielkie.