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

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 μεταβλητή την οποία προφανώς και πρέπει να έχεις δηλώσει.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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