Permalänk
Medlem

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?

Visa signatur
Permalänk
Hedersmedlem

getchar() hämtar ett tecken från tangentbordet. Har du gett något? Vad förväntar du dig av koden?

Permalänk
Medlem

Programmet väntar på att du ska mata in ett EOF-tecken, ctrl+Z i Windows och ctrl+D i Unix.

Permalänk
Medlem

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?

Visa signatur
Permalänk
Hedersmedlem

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.

Permalänk
Medlem

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?

Visa signatur
Permalänk
Medlem

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.

Permalänk
Skrivet av Brajan:

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.

Visa signatur

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

Permalänk
Medlem
Skrivet av Skyflyer:

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?

Visa signatur
Permalänk
Medlem
Skrivet av Brajan:

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

Permalänk
Medlem

Då är min fråga hur man skall kontrollera att en sträng innehåller en massa blanksteg på olika ställen?

Visa signatur
Permalänk
Medlem

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;
}

Visa signatur

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.

Permalänk
Medlem
Skrivet av sorkin:

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?

Visa signatur
Permalänk
Medlem

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.

Visa signatur

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.

Permalänk
Medlem

Ser att forumet filtrerar bort multipla blanksteg så det ser lite konstigt ut i exemplen ovan

Visa signatur

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.

Permalänk
Hedersmedlem
Skrivet av sorkin:

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).

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.