2015-03-10 3 views
0

Я пытаюсь написать программу c, которая получает два числа с плавающей точкой от пользователя, а затем вызывает другую программу с помощью команды execv(). Но я не могу этого сделать, из-за преобразования float в char или я не знаю почему. Проблема заключается в том, что команда execv() не работает; выход должен быть такимКоманда sprintf() не работает

Введите первый Num: 5
Введите второй Номер: 7
5,000000 + 7,000000 = 12,000000
parentPID: 9745 childPID: 9746 теперь работает

но это походит что теперь

Введите первый Num: 5
Введите второй Номер: 7
parentPID: 9753 childPID: 9754 теперь работает

моя первая с программой sum.c

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
int main(int argc, char **argv) { 
    if(argc!=3) 
    printf("error...\n"); 
    double a=atof(argv[1]); 
    double b=atof(argv[2]); 
    printf("%lf + %lf = %lf \n",a,b,a+b); 
    return 0; 
} 

и вторая программа calculate.c

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
int main() 
{ 
    float x,y; 
    pid_t pid; 

    printf("Enter first num: "); 
    scanf("%f",&x); 
    printf("Enter second num: "); 
    scanf("%f",&y); 

    if((pid=fork())== -1) 
    { 
    printf("can not fork..\n"); 
    exit(1); 
    } 
    if(pid==0) //child 
    { 

    pid=getpid(); 
    char *temp[] = {NULL,NULL,NULL,NULL}; 
    temp[0]="sum"; 
    sprintf(*temp[1],"%f",x); //here I want to convert float number to char but it doesn't work 
    sprintf(*temp[2],"%f",y); 
    execv("sum",temp); 
    } 
    else 
    { 
    wait(NULL); 
    printf("parentPID: %d childPID: %d works now.\n", getpid(), pid); 
    } 

    return 0; 
} 
+1

Что именно «я не могу сделать» означает? В чем проблема? Просьба уточнить. –

ответ

4
char command1[50], command2[50]; // Added 
char *temp[] = {NULL, command1, command2, NULL}; // Modified 
temp[0]="sum"; 
sprintf(temp[1],"%f",x); // remove * 
sprintf(temp[2],"%f",y); // remove * 

Вы не alloc живать в temp[1] и temp[2] и использовать их в качестве целевого буфера в sprintf и с использованием некорректных * в Спринт.

Вы можете использовать malloc для выделения этой памяти или использовать другую строку, как показано в приведенном выше примере, для инициализации массива.


С любезного комментарием Sourav Ghosh:

В sum.c, изменение ниже строк кода:

if(argc!=3) 
{ 
    printf("error...\n"); 
    return -1; 
} 

или иначе, это may привести к непредсказуемому поведению.

+0

, но он все еще не работает. –

+3

@MohitJain sir, любезно упомянуть о требовании оператора exit или return в случае 'if (argc! = 3)' для первого кода. В противном случае это может привести к UB, используя 'argv [1]' и так далее. –

+1

Какая ошибка вы получаете? Сделали ли вы все 4 изменения, которые я предложил и перекомпилировали правильно. Я предлагаю использовать gcc -W -Wall -O2 флаги для компиляции. –