【问题标题】:OpenMPI C language scanf does not stop taking input (Mac OS X 10.10)OpenMPI C 语言 scanf 不会停止接受输入 (Mac OS X 10.10)
【发布时间】:2014-12-25 11:57:30
【问题描述】:

我正在尝试运行以下 MPI 代码。问题在于scanf。该命令继续接受输入,并且在任何地方都没有。它应该只接受一个输入字符串。

#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;
}

输出:

平台:Mac OS X 10.10

MPI 版本:打开 MPI:1.8.3

系统信息: Apple LLVM 版本 6.0 (clang-600.0.54) (基于 LLVM 3.5svn) 目标:x86_64-apple-darwin14.0.0 线程模型:posix

如果我在某个地方错了,请纠正我。

【问题讨论】:

  • 在所有字符串的末尾为空终止 \0 字符留出一些位置:char string[length+1]; 它会改变行为吗?您可以指定要读取的最大字符数:scanf ("%10s", string);
  • 没用@francis.
  • 什么“没用”?发布更改的结果。您是 1) 更改为 char string[length+1]; 2) 更改为 scanf ("%10s", string); 还是 3) 两者都更改?两者都需要。
  • 我应用了所有案例 1)、2) 和两者。行为没有变化。当它要求输入时,我输入一些内容并按 Enter,然后它什么也不做。你唯一能做的就是继续提供输入,希望它会在某个地方停止。
  • 没有被调用函数的返回值被保存/测试,因此代码失败的实际点可能在任何地方。首先,在 if(myrank ==0) 之前添加一个 printf 以显示实际值(并指示代码是否到达那里。由于控制台上没有关于无法识别的命令的消息,它用于确保程序挂在被调用函数之一中

标签: c string scanf openmpi


【解决方案1】:

由于将输入转发到所有进程的复杂性,在 MPI 程序中通常不建议从 stdin 读取。它不能在不同的实现之间移植。

通常,人们获取应用程序输入的方式是读取输入文件。这在任何地方都有效,您所要做的就是让文件在所有进程中都可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多