Sida 1 av 1
[C] Felaktig utmatning med printf() och system() [LÖST]
Postat: 24 okt 2009, 11:37
av Christian Holmberg
Här är koden:
Kod: Markera allt
#include <stdio.h>
main () {
printf("Hi, my name is: ");
system("whoami");
printf("\n");
printf("Nice to meet you.\n");
}
här är utmatningen jag får på mitt system:
Kod: Markera allt
christian@Server:~/Programming/C/hello_world$ ./hello2
<ditt kontonamn>
Hi, my name is:
Nice to meet you.
Om man följer strukturen i programmet så borde utmatningen bli följande:
Kod: Markera allt
Hi, my man is <ditt kontonamn>
Nice to meet you
men så är inte fallet. Vad är det som spökar?
Re: felaktig utmating i mitt hello world program skrivet i C
Postat: 24 okt 2009, 12:06
av Konservburk
printf() är rad-buffrad, vilket betyder att ingenting skrivs ut innan det kommer en nyrad. Men du kan använda fflush(stout) för att tvinga fram en utskrift:
Kod: Markera allt
printf("Hi, my name is: ");
fflush(stdout);
system("whoami");
printf("Nice to meet you.\n");
Det går även att stänga av buffringen:
Kod: Markera allt
setvbuf(stdout, 0, _IONBF, 0);
printf("Hi, my name is: ");
system("whoami");
printf("Nice to meet you.\n");
Eller så använder du obuffrade lågnivå-funktioner istället:
Kod: Markera allt
write(0, "Hi, my name is: ", 16);
system("whoami");
write(0, "Nice to meet you.\n", 18);
Re: felaktig utmating i mitt hello world program skrivet i C
Postat: 24 okt 2009, 12:10
av Christian Holmberg
Tack.
Alltså var det mina C-skills som spöka

Re: felaktig utmating i mitt hello world program skrivet i C
Postat: 24 okt 2009, 12:54
av Konservburk
En bättre lösning är annars att inte använda sig av system("whoami")...
Kod: Markera allt
#include <stdio.h>
#include <unistd.h>
#include <pwd.h>
int
main()
{
struct passwd *pw;
if ((pw = getpwuid(geteuid())))
{
printf("Hi, my name is: %s\n", pw->pw_name);
printf("Nice to meet you.\n");
return 0;
}
return 1;
}
Re: felaktig utmating i mitt hello world program skrivet i C
Postat: 31 okt 2009, 10:48
av jsiei97
Konservburk skrev:En bättre lösning är annars att inte använda sig av system("whoami")...
Kod: Markera allt
#include <stdio.h>
#include <unistd.h>
#include <pwd.h>
int
main()
{
struct passwd *pw;
if ((pw = getpwuid(geteuid())))
{
printf("Hi, my name is: %s\n", pw->pw_name);
printf("Nice to meet you.\n");
return 0;
}
return 1;
}
Bra mycket snyggare lösning
