Bugg i C-programmet?

Tråden skapades och har fått 5 svar. Det senaste inlägget skrevs .
1

Jag försöker att lära mig C och jag tror att det går framåt. Jag har precis hittat getchar och putchar och använt dem i ett program:

#include <stdio.h>

void las_rad(char rad[])	/* Läser en hel rad. */
{
	char c;
	int i;
	
	i = 0;
	while ((c = getchar()) != '\n') {
 .rad[i] = c;
 .i++;
	}
	rad[i] = '\0';
}

void skriv_rad(char rad[])	/* Skriver en hel rad. */
{
	int i = 0;
	while (rad[i] != '\0') {
 .putchar(rad[i]);
 .i++;
	}
}

int main (int argc, const char * argv[]) /* Läsning och skrivning av en hel rad. */
{
	char namn[20];
	printf("Vad heter du?\n");
	las_rad(namn);	// Anropning av las_rad för att läsa in 'namn'.
	printf("Hej ");
	skriv_rad(namn); // Anropning av skriv_rad för att skriva ut 'namn'.
	printf(".\n");
	return 0; // Programmet klart. Funktionen main reurnerar 0 för att visa att allt är OK.
}

Så här såg det nyss ut i Terminal när jag provade:

Citat:

fl-ar01:~/Documents/Programmering/hello3/build/Debug marcus$ ./hello3
Vad heter du?
Steve Wozniak
Hej Steve Wozniak.
fl-ar01:~/Documents/Programmering/hello3/build/Debug marcus$ ./hello3
Vad heter du?
Steve Wozniak
Hej ASteve Wozniak.
fl-ar01:~/Documents/Programmering/hello3/build/Debug marcus$ ./hello3
Vad heter du?
Steve Wozniak
Hej Steve Wozniak.
fl-ar01:~/Documents/Programmering/hello3/build/Debug marcus$ ./hello3
Vad heter du?
Steve Wozniak
Hej Steve Wozniak.

Observera att de i andra försöket står ASteve Wozniak trots att det i inmatningen står Steve Wozniak. Just i det exemplet hade jag nämligen råkat skriva ett stort A först men tagit bort det med backsteg. Detta fenomen har jag dock inte lyckats återskapa.

Inträffande det här av en slump, eller är det något problem med C-koden?

  • Oregistrerad
  • 2006-01-04 21:12

Jag har testat att köra ditt exempel ett antal gånger, och aldrig lyckats få programmet att skriva ut en "suddad" bokstav. Jag har även kört det steg-för-steg i Code Warriors debugger utan att lyckas provocera fram något.

Jag kan iaf inte se något fel med koden, men det var ett tag sen jag höll på med "interaktiva" konsoll-program, så det är mycket möjligt att jag missat någon bug...

/Markus

Tack. Då får jag anta att vad som än hände så var det inte programmet som låg bakom.

Ursprungligen av Björn Leander:

Tack. Då får jag anta att vad som än hände så var det inte programmet som låg bakom.

Även om det inte kan förklara varför den suddade bokstaven skrevs ut, så kan man se i din programkod att bokstaven fortfarande sparas i strängen (men eftersom även backspace sparas så ska det inte synas när man skriver ut). Det gör ju att din begränsning på 20 tecken inte gäller den inmatade strängens längd, utan snarare antal tangentnedtryckningar i las_rad(). Skriver du först ex. ditt eget namn, suddar ut det, och sedan skriver Steve Wozniak, så kommer du att skriva över en del av stacken och ditt program kommer förmodligen att krascha.

/Erik

  • Medlem
  • 2006-01-05 03:58
Ursprungligen av Erik Aderstedt:

Även om det inte kan förklara varför den suddade bokstaven skrevs ut, så kan man se i din programkod att bokstaven fortfarande sparas i strängen (men eftersom även backspace sparas så ska det inte synas när man skriver ut). Det gör ju att din begränsning på 20 tecken inte gäller den inmatade strängens längd, utan snarare antal tangentnedtryckningar i las_rad(). Skriver du först ex. ditt eget namn, suddar ut det, och sedan skriver Steve Wozniak, så kommer du att skriva över en del av stacken och ditt program kommer förmodligen att krascha.

stdin är buffrad. Den kommer inte returnera en sträng med BACKSPACE i.

Ursprungligen av deric:

stdin är buffrad. Den kommer inte returnera en sträng med BACKSPACE i.

Normalt är stdin buffrad ja, men här läser ju programmet in tecken för tecken?

För skojs skull kompilerade jag programmet och lade in en strlen-koll i skriv_rad. Matar jag sen in "Hopp", följt av tre backspace, och sen "Hopp" igen får jag en stränglängd på 11 (som väntat) och en utskrift av "HHopp". Skriver man ut strängen som heltal ser man att det har lagrats ASCII-kod 8 (backspace) i strängen.

/Erik

1
Bevaka tråden