2014-10-29 108 views
1

我試圖運行以下MPI代碼。問題出在scanf。該命令繼續進行輸入並且不在任何地方。它應該只帶一個輸入字符串。OpenMPI C語言scanf不停止輸入(Mac OS X 10.10)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <mpi.h> 

int main(int argc,char * argv[]) 
{ 
    int npes, myrank, length = 10; 
    char string[length+1];  // array size changed to length +1 as suggested in comments. 
    memset(string, 0, length+1); 
    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &npes); 
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 

    if (myrank == 0) { 
     printf("Please enter the string of length %d or enter 0 to generate string randomly:\n", length); 
     scanf ("%10s", string);  // format changed as suggested in comments 
     printf("%s\n", string); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

輸出:

enter image description here

平臺:Mac OS X的10.10

MPI版本:打開MPI:1.8.3

系統信息: 蘋果LLVM 6.0版(鐺 - 600.0.54)(基於LLVM 3.5svn) 目標:x86_64的 - 蘋果darwin14.0.0 線程模型:POSIX

請糾正我,如果我錯了地方。

+1

給所有字符串末尾的空字符'\ 0'留下一些位置:'char string [length + 1];'它會改變行爲嗎?您可以指定要讀取的最大字符數:'scanf(「%10s」,字符串);' – francis 2014-10-29 17:25:16

+0

不能工作@francis。 – harshitgupta 2014-10-29 17:50:45

+1

什麼「不起作用」?發佈更改的結果。你1)更改爲'字符串[長度+ 1];'2)更改爲'scanf(「%10s」,字符串);'或3)兩者?你需要兩個。 – chux 2014-10-29 19:17:11

回答

1

從MPI程序中讀取stdin通常是不可取的,因爲將輸入轉發到所有進程非常複雜。這不是在不同實現之間可移植的東西。

通常,人們獲取應用程序輸入的方式是讀取輸入文件。這在任何地方都行得通,你所要做的就是使文件在所有進程中可用。