5

このプログラムは、最初にフォークされ、次に execlp によって実行されます。これは、累乗と基数の 2 つの数値でプログラム パスを呼び出します。

int main(int argc, char *argv[])
{
    int pid = getpid();
    printf("Calculator Process[%d]: started\n",pid);
    double base, power;
    sscanf(argv[1],"%d",&base);
    sscanf(argv[2],"%d",&power);
    double number = pow(base,power);
    printf("Calculator Process[%d]: %d ^^ %d == %d\n",pid,base,power,number);
    printf("Calculator Process[%d]: exiting\n",pid);
    return 1;
}

基数 3、累乗 5 を渡すとしましょう。これが得られるものです。

base = 4263 -- これもたまたま PID です。
パワー = -1
累乗: 714477568

発信者番号:

execlp("./calculator","./calculator",argv[1],argv[2],(char*)0);

argvs を出力すると、その値が取得されます (char* として取得されますが、キャストは失敗します)。

値を正しく読み取れない理由はありますか?

4

2 に答える 2

9

どちらかを二重に読んでください:

double base, power;
sscanf(argv[1],"%lf",&base);
sscanf(argv[2],"%lf",&power);

または整数にスキャンします。

int base, power;
sscanf(argv[1],"%d",&base);
sscanf(argv[2],"%d",&power);
于 2012-09-19T15:51:05.873 に答える
0

コードをすばやく調整するだけで、次のようになります。

int main(int argc, char *argv[]) 
{
    int pid = getpid();
    printf("Calculator Process[%d]: started\n",pid);
    double base, power;
    base = atof(argv[1]);
    power = atof(argv[2]);
    double number = pow(base,power);
    printf("Calculator Process[%d]: %f ^^ %f == %f\n",pid,base,power,number);
    printf("Calculator Process[%d]: exiting\n",pid);
    return 1; 

}

  1. char配列を数字に変換するには、使用できますatof()
  2. printf を double に更新することを忘れないでください。そうしない%fと、出力に正しく表示されません!
于 2012-09-19T16:16:51.150 に答える