Προς το περιεχόμενο

sprintf- c


spilia

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα

εχω προβλημα με αυτη την συναρτηση.

 

sprintf(pid, "%d\n", getpid())

γραφω αυτη την συναρτηση

αυτο που θελω να ρωτησω ειναι πως οπως ειδα οτι η μεταβλητη pid γινεται τυπου char και ας την εχω δηλωσει πιο πριν ως int. Γνωριζει κανεις γιατι γινεται αυτο?

 

 

ευχαριστω

Δημοσ.

Λίγο αμφίβολο να αλλάζει ο τύπος της μεταβλητής από int σε char. Πώς το έλεγξες;

 

Αλλά δεν έχει και ιδιαίτερη σημασία αυτό, γιατί το πρωτότυπο της sprintf είναι ως εξής:

 

>int sprintf ( char * str, const char * format, ... );

 

Δηλαδή, δέχεται ως πρώτο όρισμα δείκτη σε char. Εσύ δεν περνάς δείκτη σε char, αλλά μία int μεταβλητή και ο compiler σου κανονικά θα πρέπει να σε προειδοποίησε με σχετικό warning. Π.χ. ο ακόλουθος κώδικας:

 

>
#include <stdio.h>

int main() {
   int pid = 0;

   sprintf(pid, "%d\n", 128);

   return 0;
}

 

κατά το compile με GCC δίνει τα παρακάτω warnings:

>
parsifal@vmubuntu32:/tmp$ gcc -Wall -o test test.c
test.c: In function ‘main’:
test.c:6: warning: passing argument 1 of ‘sprintf’ makes pointer from integer without a cast
/usr/include/stdio.h:361: note: expected ‘char * __restrict__’ but argument is of type ‘int’

 

και φυσικά, αν εκτελέσεις το binary παίρνεις ένα ωραιότατο segfault:

 

>
parsifal@vmubuntu32:/tmp$ ./test 
Segmentation fault

Δημοσ.

>#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>

int i, j, stat, ret, n, tyxaios, fd[4], num[4];
int sum, k, cpid, number;
char str, ch, buff[200], pid[100], ppid[100];


main(int argc, char *argv[]){

//Elegxos gia to an dothikan 3 orismata apton xrhsth
if (argc!=4){
printf("Need 3 file names plz\n");
exit(1);
}

for (i=1; i<=3; i++){
fd[i]=open(argv[i], O_WRONLY | O_CREAT | O_TRUNC,0644); //Anoigma arxeiou gia diavasma kai grapsimo (dhmiourgia an den yparxei)
if (fd[i]==-1){	//Elegxos gia to an ypirkse sfalma
    perror("open");
    exit(2);
}

ret=fork();	//Dhmiourgia paidiou
if (ret==-1){	//kai elegxos gia tyxon sfalma
    perror("fork");
    exit(3);
}
if (ret!=0){	//O pateras
wait(&stat);	//perimenei to paidi na teliwsei
}else{

sprintf(pid, "%d\n", getpid());	//To pid tou paidiou apothikevete sto pid kai metatroph se string
n=write(fd[i],pid,strlen(pid));	//Grapsimo se arxeio

tyxaios=rand();	
sprintf(ppid, "%d\n", tyxaios*getppid());	//PPid*tyxaio_arithmo kai metatroph se string

n=write(fd[i],ppid, strlen(ppid));	//Grapsimo ppid*tyxaio_arithmo sto arxeio

close(fd[i]);	//Kleisimo arxeiou
return(20);	//Termatismos paidiou
}

 

 

Εχω φτιαξει κατι τετοιο.αυτο ειναι το πρωτο κομματι.με δυσκολευε να δωσω τιμη στον pid kai ppid επειδη στο write τα ηθελα char αλλα εξ αρχης ηταν int .

 

προσπαθησα αρχικα με

>(char) pid=getpid();

αλλα μ εβγαζε λαθος.

Δημοσ.

Μάλιστα, κατάλαβα. Για μετατροπή ενός ακεραίου σε αλφαριθμητικό, υπάρχει η itoa, αλλά δυστυχώς δεν είναι standard ANSI C function αν σε ενδιαφέρει το portability του κώδικα. Η άλλη λύση είναι με την χρήση της sprintf, όπως κάνεις ήδη. Για τις ανάγκες του κώδικά σου πάντως, δε νομίζω πως χρειάζεσαι δύο διαφορετικά strings (και pid και ppid μεταβλητή), απλά έναν μόνο προσωρινό πίνακα χαρακτήρων που θα του δίνεις τιμή με την sprintf (από τις integer πλέον μεταβλητές pid και ppid), αμέσως πριν κάνεις την αντίστοιχη κλήση της write. Και σίγουρα δεν χρειάζεται να έχει τόσο μεγάλο μέγεθος. Δε νομίζω πως υπάρχει λειτουργικό στο οποίο θα δεις PIDs μήκους 99 ή 100 ψηφίων!

Δημοσ.

δοκιμασα την συναρτηση που μ ειπες αλλα δεν βοηθησε.

 

εχει και αλλο κομματι κωδικα οπου πρεπει να εχω διαθεσιμους και πιδ και ππιντ ωστε να τα χρησιμοποιω.

 

και μια ερωτηση λιγο ασχεητ με τα παραπανω

 

wait(&stat);

 

στο στατ μπορω να βαλω οτι μεταβλητη θελω σωστα?

δηλαδη μπορουσα να βαλω μεσα οτι να ναι αρκει να το δηλωνα παραπανω.

Δημοσ.

δοκιμασα την συναρτηση που μ ειπες αλλα δεν βοηθησε.

 

εχει και αλλο κομματι κωδικα οπου πρεπει να εχω διαθεσιμους και πιδ και ππιντ ωστε να τα χρησιμοποιω.

 

Γιατί δε βοήθησε, τί ακριβώς πήγε στραβά;

 

 

και μια ερωτηση λιγο ασχεητ με τα παραπανω

 

wait(&stat);

 

στο στατ μπορω να βαλω οτι μεταβλητη θελω σωστα?

δηλαδη μπορουσα να βαλω μεσα οτι να ναι αρκει να το δηλωνα παραπανω.

Απ' όσο θυμάμαι από τα Λειτουργικά, μία οποιαδήποτε int μεταβλητή την οποία προφανώς και πρέπει να έχεις δηλώσει.

Δημοσ.

εβγαζε ερρορ ,δηλαδη νομιζω δεν την υποστιριζει!ευχαριστω πολυ για την βοηθεια.ειμαι σιγουρος πως στο μελλον θα σε ξαναχρειαστω καθως τωρα προσπαθω να μαθω.

 

καλο σου βραδυ!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...