Scanf языка OpenMPI C не перестает принимать ввод (Mac OS X 10.10)

Я пытаюсь запустить следующий код 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: Open MPI: 1.8.3

Информация о системе: Apple LLVM версии 6.0 (clang-600.0.54) (на основе LLVM 3.5svn) Цель: x86_64-apple-darwin14.0.0 Модель потока: posix

Пожалуйста, поправьте меня, если я где-то ошибаюсь.


person Harshit Gupta    schedule 29.10.2014    source источник
comment
Оставьте место для нулевого завершающего символа \0 в конце всех строк: char string[length+1]; Изменяет ли это поведение? Вы можете указать максимальное количество символов для чтения: scanf ("%10s", string);   -  person francis    schedule 29.10.2014
comment
не сработало @francis.   -  person Harshit Gupta    schedule 29.10.2014
comment
Что не сработало? Опубликовать результаты изменения. Вы 1) поменяли на char string[length+1]; 2) поменяли на scanf ("%10s", string); или 3) на оба? Вам нужны оба.   -  person chux - Reinstate Monica    schedule 29.10.2014
comment
Я применил все случаи 1), 2) и оба. Никаких изменений в поведении. Когда он запрашивает ввод, я набираю что-то и нажимаю ввод, а затем он ничего не делает. Единственное, что вы можете сделать, это продолжать подавать входные данные, надеясь, что это где-то остановится.   -  person Harshit Gupta    schedule 29.10.2014
comment
ни одно из возвращаемых значений из вызываемых функций не сохраняется/не тестируется, поэтому фактическая точка, в которой код дает сбой, может быть где угодно. Для начала добавьте printf перед if(myrank ==0), чтобы отобразить фактическое значение (и указать, попадает ли код туда каждый раз. Поскольку в консоли нет сообщений о нераспознанных командах, это для уверен, что программа зависла в одной из вызываемых функций   -  person user3629249    schedule 30.10.2014
comment
Какая это версия Open MPI? У меня работает на линуксе.   -  person Hristo Iliev    schedule 30.10.2014
comment
у меня на ubuntu тоже работает нормально. Но моя рабочая система Mac OS x   -  person Harshit Gupta    schedule 30.10.2014
comment
Как именно вы запускаете программу? Вы запускаете его в терминале или используете какую-то IDE? (трудно сказать по скриншоту)   -  person Hristo Iliev    schedule 31.10.2014


Ответы (1)


Чтение из stdin обычно не рекомендуется в программах MPI из-за сложности перенаправления ввода всем процессам. Это не то, что будет переносимым между различными реализациями.

Обычно люди получают входные данные для своих приложений, читая входные файлы. Это работает везде, и все, что вам нужно сделать, это сделать файл доступным для всех процессов.

person Wesley Bland    schedule 29.10.2014