Verktyg Visningsval
2013-04-17, 11:18   #1

Brajan

Medlem

Brajans avatar

Plats: Växjö

Registrerad: apr 2007

C-programmering, EOF


Hejsan,

Jag håller på att sätta mig in i lite C-programmering och sitter med följande program:

#include <stdio.h>

int main()
{
	int c, ln;

	while((c = getchar()) != EOF)
	{
		if(c == '\n' || c == '\t')
		{
			++ln;
		}
	}
	
	printf("%d\n", ln);

	return 0;
}
När jag kompilerar programmet och skall köra det, så genereras det ingenting. Den står bara och blinkar.

Någon som vet varför?
__________________
http://ocnordic.com
Brajan är inte uppkopplad
2013-04-17, 11:25   #2

Shimonu

Moderator

Shimonus avatar

Plats: Linköping

Registrerad: okt 2006

getchar() hämtar ett tecken från tangentbordet. Har du gett något? Vad förväntar du dig av koden?
__________________
Har du åsikter om moderering, frågor eller något annat kan du kontakta mig via shimonu@sweclockers.com
Shimonu är inte uppkopplad Folding
2013-04-17, 11:25   #3

perost

Medlem

perosts avatar

Plats: Linköping

Registrerad: jun 2007

Programmet väntar på att du ska mata in ett EOF-tecken, ctrl+Z i Windows och ctrl+D i Unix.
__________________
[Stationär]: i7 930@3.4 | GTX 560 Ti | 12 GB DDR3 1600 | GA-X58A-UD3R | P180B | VX450W | Logitech MX1100 | Realforce 88UB | Arch64
[Bärbar]: HP 5310m | P9400 | 2 GB RAM | Corsair Force F60 | Arch64
perost är inte uppkopplad
2013-04-17, 11:30   #4

Brajan

Medlem

Brajans avatar

Plats: Växjö

Registrerad: apr 2007

Tack!

Har också en annan fråga. Det står såhär: "Write a program to copy its input to its output".

Menar dem att man skall kopiera från getchar till putchar?
__________________
http://ocnordic.com
Brajan är inte uppkopplad
2013-04-17, 12:40   #5

Shimonu

Moderator

Shimonus avatar

Plats: Linköping

Registrerad: okt 2006

Ja det låter rimligt. Det är ju precis vad som görs när man skriver hela tiden. Du tar in från tangentbordet och skriver ut till skärmen.
__________________
Har du åsikter om moderering, frågor eller något annat kan du kontakta mig via shimonu@sweclockers.com
Shimonu är inte uppkopplad Folding
2013-04-17, 13:25   #6

Brajan

Medlem

Brajans avatar

Plats: Växjö

Registrerad: apr 2007

Dock så lyder hela uppgiften såhär:

Write a program to copy its input to its output, replacing each
string of one or more blanks by a single blank.

Hur skall jag lösa den uppgiften utan att blanda in vektorer eller liknande? Hur kontrollerar jag om en textsträng innehåller fler än 1 blanksteg?
__________________
http://ocnordic.com
Brajan är inte uppkopplad
2013-04-17, 13:36   #7

Skyflyer

Medlem

Plats: Kista

Registrerad: aug 2004

Vad jag fattar så verkar det som om de vill att man ska ta bort alla space (mellanslag) som hänger ihop. Då kan du ju skapa en variabel där du sparar det senaste tecknet du tagit emot. När du sedan ska skriva ut det nyss inskrivna tecknet med putchar så jämför om det nya tecknet är ett mellanslag samt att föregående tecknet också är ett mellanslag. Om detta är sant så skriver du inte ut detta tecken med putchar.

Då kommer programmet endast skriva ut ett mellanslag och aldrig flera mellanslag i en följd. Fortsätter man skriva med andra tecken så kommer man sedan kunna skriva ut ett till mellanslag. Dvs, du kommer få max ett mellanslag mellan varje ord.
Skyflyer är inte uppkopplad
2013-04-17, 13:37   #8

zyber_zero

Medlem

Plats: Göteborg

Registrerad: jun 2005

Citat:
Ursprungligen inskrivet av Brajan Visa inlägg
Dock så lyder hela uppgiften såhär:

Write a program to copy its input to its output, replacing each
string of one or more blanks by a single blank.

Hur skall jag lösa den uppgiften utan att blanda in vektorer eller liknande? Hur kontrollerar jag om en textsträng innehåller fler än 1 blanksteg?
Ett enkelt sätt är ju att när du kommer till ett blanktecken, så loopar du vidare till första icke-blank-tecken och fortsätter därifrån.
__________________
Workstation: Dell Latitude E5400, WinXP/Ubuntu 9.10. 4 GB RAM, 250GB, P8700 @ 2.53GHz
HTPC: MythBuntu, 2GB RAM, 1TB, Atom dual core @ 1.6 GHz, Sanyo PLV-Z700
Server #1: Ubuntu, 2 GB RAM, 4*143 GB 10K RAID0 +2*73GB 15K RAID1. Intel Xeon dual core @3.2 GHz
zyber_zero är inte uppkopplad
2013-04-17, 13:58   #9

Brajan

Medlem

Brajans avatar

Plats: Växjö

Registrerad: apr 2007

Citat:
Ursprungligen inskrivet av Skyflyer Visa inlägg
Vad jag fattar så verkar det som om de vill att man ska ta bort alla space (mellanslag) som hänger ihop. Då kan du ju skapa en variabel där du sparar det senaste tecknet du tagit emot. När du sedan ska skriva ut det nyss inskrivna tecknet med putchar så jämför om det nya tecknet är ett mellanslag samt att föregående tecknet också är ett mellanslag. Om detta är sant så skriver du inte ut detta tecken med putchar.

Då kommer programmet endast skriva ut ett mellanslag och aldrig flera mellanslag i en följd. Fortsätter man skriva med andra tecken så kommer man sedan kunna skriva ut ett till mellanslag. Dvs, du kommer få max ett mellanslag mellan varje ord.
Jag förstår inte riktigt.

Nu när jag läser igenom frågan så tolkar jag det som att om en sträng BARA innehåller blanksteg, så skall den kortas ner till bara 1 blanksteg. Eller gäller det om det är bokstäver involverade i strängen?
__________________
http://ocnordic.com
Brajan är inte uppkopplad
2013-04-17, 15:01   #10

conio

Medlem

conios avatar

Registrerad: okt 2003

Citat:
Ursprungligen inskrivet av Brajan Visa inlägg
Jag förstår inte riktigt.

Nu när jag läser igenom frågan så tolkar jag det som att om en sträng BARA innehåller blanksteg, så skall den kortas ner till bara 1 blanksteg. Eller gäller det om det är bokstäver involverade i strängen?
Jag är ganska säker på att de menar att om man skickar in strängen
This      is a      string
så ska utdatat vara "This is a string"

//C
conio är inte uppkopplad
2013-04-17, 15:20   #11

Brajan

Medlem

Brajans avatar

Plats: Växjö

Registrerad: apr 2007

Då är min fråga hur man skall kontrollera att en sträng innehåller en massa blanksteg på olika ställen?
__________________
http://ocnordic.com
Brajan är inte uppkopplad
2013-04-17, 15:35   #12

sorkin

Medlem

Plats: Stockholm

Registrerad: mar 2010

Så här kanske?

#include <stdio.h>

int main()
{
int c, ln, flag = 0;



while((c = getchar()) != EOF)
{
if(c == ' ' )
{
flag = 1;
}
else
{
if(flag == 1)
{
putchar(' ');
flag = 0;
}
putchar(c);
}
}

return 0;
}
__________________
ii7 2600K @ 4500 mhz, P8Z68-V Pro, 16 GB Vengeance LP @ 1600 mhz, Samsung 830 256 GB (system), X25-M 160 GB, Chieftec 650W PSU, GTX 660 2GB, CM ATCS 840, NH-D14, WIN 8 pro. Sidekick - Acer TimelineX 3820TG.
sorkin är inte uppkopplad
2013-04-17, 15:42   #13

Brajan

Medlem

Brajans avatar

Plats: Växjö

Registrerad: apr 2007

Citat:
Ursprungligen inskrivet av sorkin Visa inlägg
Så här kanske?

#include <stdio.h>

int main()
{
int c, ln, flag = 0;



while((c = getchar()) != EOF)
{
if(c == ' ' )
{
flag = 1;
}
else
{
if(flag == 1)
{
putchar(' ');
flag = 0;
}
putchar(c);
}
}

return 0;
}
Den kontrollerar väl inte om en sträng innehåller fler än 1 blanksteg? Om jag matar in Hej på dig, fungerar då din kod?
__________________
http://ocnordic.com
Brajan är inte uppkopplad
2013-04-17, 16:03   #14

sorkin

Medlem

Plats: Stockholm

Registrerad: mar 2010

Det kommer inte att skriva ut några inmatade blanksteg utan bara sätta flag = 1, sen när något annat tecken kommer så skrivs det ut ett blanksteg och tecknet själv om flag == 1 (blanksteg innan) och flaggan nollställs. Är flaggan 0 och det kommer något annat än blank så skrivs tecknet ut. Det kommer att resultera i att "Hej Hopp" blir "Hej Hopp" etc.
__________________
ii7 2600K @ 4500 mhz, P8Z68-V Pro, 16 GB Vengeance LP @ 1600 mhz, Samsung 830 256 GB (system), X25-M 160 GB, Chieftec 650W PSU, GTX 660 2GB, CM ATCS 840, NH-D14, WIN 8 pro. Sidekick - Acer TimelineX 3820TG.
sorkin är inte uppkopplad
2013-04-17, 16:04   #15

sorkin

Medlem

Plats: Stockholm

Registrerad: mar 2010

Ser att forumet filtrerar bort multipla blanksteg så det ser lite konstigt ut i exemplen ovan
__________________
ii7 2600K @ 4500 mhz, P8Z68-V Pro, 16 GB Vengeance LP @ 1600 mhz, Samsung 830 256 GB (system), X25-M 160 GB, Chieftec 650W PSU, GTX 660 2GB, CM ATCS 840, NH-D14, WIN 8 pro. Sidekick - Acer TimelineX 3820TG.
sorkin är inte uppkopplad
2013-04-18, 11:29   #16

phz114n

Moderator

phz114ns avatar

Plats: Göteborg

Registrerad: okt 2002

Citat:
Ursprungligen inskrivet av sorkin Visa inlägg
Ser att forumet filtrerar bort multipla blanksteg så det ser lite konstigt ut i exemplen ovan
Använd [code]-taggar; alternativt detta: " " magiska blanksteg (u00a0) med vilket man kan göra multipla  mellanslag   utan     att     de      kollapsar eller radbryter. Bör gå att kopiera in i ett meddelande rakt av, eller lära sig hur man skriver in manuellt (ofta användbart för att undvika radbrytning på strategiska ställen).
phz114n är uppkopplad nu
Senaste nyheterna

Redaktionens senaste nyhetsrubriker

Sök jobb