【发布时间】: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 以显示实际值(并指示代码是否到达那里。由于控制台上没有关于无法识别的命令的消息,它用于确保程序挂在被调用函数之一中