Scanf v C - segmentace – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Scanf v C - segmentace – C / C++ – Fórum – Programujte.comScanf v C - segmentace – C / C++ – Fórum – Programujte.com

 

tap97010
Newbie
18. 4. 2011   #1
-
0
-

Vyrábím konzolový textový editor. a nechce mi fungovat 2. funkce scanf:

#include <stdio.h>


int main(void){
char c;
char *b;
char *a;
FILE *wfile;
printf("Text editor for new

files\n=========================\n Write name of file: ");
scanf("%s", a);
wfile = fopen(a, "a");
printf("write text:\n");
while (1==1){
scanf("%s", b); //Ta nefunguje.
fprintf(wfile, "%s", b);
scanf("%c", &c);
if (c = "q"){
break;
}
else{
fprintf(wfile, "%s", c);
}
}
printf("File %s is probably saved.", a);
getch();
}

Má ukládat zadaný text (v char b) ukládat do souboru(wfile, jméno zadáno do proměnné char a), po stisknutí enteru a následně q by ho ukončil.
(Programuju v Dev-C++.)

Nahlásit jako SPAM
IP: 78.108.97.–
nervak0
Věrný člen
18. 4. 2011   #2
-
0
-

scanf jen načítá data na zadané adresy, nic nealokuje, takže musíš pro ten řetezec předem připravit místo.

char a[1000];

char b[1000];
Ty používáš neinicializované ukazatele (načítáš na náhodné adresy) a jestli to nespadne hned na začátku, tak jen náhodou. Navíc scanf samozřejmě neví, kolik toho místa je a měl bys omezit délku načteného textu (ve formátovacím řetězci, nebo použitím jiné funkce).

Nahlásit jako SPAM
IP: 213.211.51.–
sputnikone+1
Věrný člen
18. 4. 2011   #3
-
0
-

To tap9701 : A jaká je velikost b a a v době běhu? Háže totiž SIGSEGV. Na řádku 18 je dle mého chyba. A pro nekonečný while stačí dát do podmínky jen 1...

Nahlásit jako SPAM
IP: 147.251.201.–
tap97010
Newbie
18. 4. 2011   #4
-
0
-

Po upravení funguje, ale přehlíží cyklus a 3. scanf (vlož q pro ukončení).
Zdroják ještě jednou:

#include <stdio.h>


int main(void){
char c;
char *b[9999];
char *a[99];
FILE *wfile;
printf("Text editor for new files\n=========================\n Write name of file: ");
scanf("%s", a);
wfile = fopen(a, "a");
printf("write text:\n");
while (1){
scanf("%s", b); //Ta nefunguje.
fprintf(wfile, "%s", b);
scanf("%c", &c);
if (c = "q"){
break;
}
else{
fprintf(wfile, "%s", c);
}
}
printf("File %s is probably saved.", a);
getch();
}

Nahlásit jako SPAM
IP: 78.108.97.–
sputnikone+1
Věrný člen
18. 4. 2011   #5
-
0
-

To tap9701 : řádek 16

if(c == 'q')

Nahlásit jako SPAM
IP: 147.251.201.–
tap97010
Newbie
18. 4. 2011   #6
-
0
-

jak poznám, že to funguje, když ihned po zadání textu (ř. 13 a 14) to skočí bez všeho na konec (ř. 23) ?

Nahlásit jako SPAM
IP: 78.108.97.–
nervak0
Věrný člen
18. 4. 2011   #7
-
0
-

5,6: místo pole znaků máš pole ukazatelů
13: načte jedno slovo
15: načte jeden znak za tím slovem (mezera, enter, ...)
16: místo porovnání máš přiřazení. místo znaku máš řetězec.
20: znak vypisuješ jako řetězec

Nahlásit jako SPAM
IP: 213.211.51.–
tap97010
Newbie
20. 4. 2011   #8
-
0
-

Tak teď je to snad lepší, ale kompilátor nechce zkompilovat ř.19 - ř.21:

#include <stdio.h>


int main(void){
char c;
char b[9999];
char a[99];
FILE *wfile;
printf("Text editor for new files\n=========================\n Write name of file: ");
scanf("%s", &a);
wfile = fopen(a, "a");
printf("write text:\n");
while (c != 'q'){ //Nefunguje
fprintf(wfile, "%c", c);
scanf("%s", &b);
fprintf(wfile, "%s\n", b);
scanf("%c", &c); //Nefunguje
}
}
printf("File %s is probably saved.", a);
getch();
}

Kompilátor píše:

ř.19: syntax error before string constant
ř.19: conflicting types for 'printf'
ř.19: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
ř.19: conflicting types for 'printf'
ř.19: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
ř.19: warning: data definition has no type or storage class
ř.20: warning: data definition has no type or storage class
ř.21: syntax error before '}' token


V čem je problém???

Nahlásit jako SPAM
IP: 78.108.97.–
Grungy0
Super člen
20. 4. 2011   #9
-
0
-

neviem, či je to tým ale na riadku 9 ti ten & netreba

scanf("%s", a);

Nahlásit jako SPAM
IP: 158.193.84.–
Prvý náznak hlúposti, je pocit geniality.
KIIV
~ Moderátor
+43
God of flame
20. 4. 2011   #10
-
0
-

neinicializovana promenna c v prvnim behu:

    while (c != 'q'){                        //Nefunguje


pole se automaticky predava jako ukazatel - tj. opravdu neni treba: scanf("%s",&a);

dale sem nejak nepochopil system odsazovani.. (az to udelas poradne - zjistis, proc ti to rve na radku 19!)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 84 hostů

Podobná vlákna

Scanf - C — založil jakub

Scanf ve funkci — založil Rostislav

C - scanf zacykleni — založil Remder

Vysvetleni funkce scanf — založil profeld

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý