Как решить проблему "Источник недоступен для" msvcrt! Fgets () "" - PullRequest
0 голосов
/ 07 сентября 2011

Код

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
class Chkinval
        {
         char  *inval;
         char *inarray;
         public:
         void inPutProcessor();

        };


void Chkinval::inPutProcessor()
{
     cout << "Input" ;
     fgets(inval,1000,stdin);
     int tmp = atoi(inval);

     for(int lpcnt=0;lpcnt< tmp;lpcnt++)
     {
           fgets(inarray,1000,stdin);
     }
     for(int lpcnt=0;lpcnt< tmp;lpcnt++)
     {
         cout << "The array elements" << inarray[lpcnt];
     }
    }

int main()
{

    Chkinval tmp1 ;
    tmp1.inPutProcessor();

    return 0;
    }

Проблема:

Программа компилируется нормально, но без результата в консоли

В режиме отладки

я получаюсообщение об ошибке "Источник недоступен для" msvcrt! fgets () ""

Это проблема операционной системы или мне нужно установить какую-либо библиотеку?

1 Ответ

2 голосов
/ 07 сентября 2011

Проблема с кодом в том виде, в каком он есть сейчас, заключается в том, что ни inval, ни inarray не инициализируются, и, таким образом, вы читаете до 1000 байтов в какую-то произвольную ячейку памяти.

 for(int lpcnt=0;lpcnt< tmp;lpcnt++)
 {
       fgets(inarray,1000,stdin);
 }

Вероятно, это также не то, что вам нужно (даже если inarray был инициализирован), поскольку оно будет перезаписывать содержимое на каждой итерации.

 fgets(inval,1000,stdin);
 int tmp = atoi(inval);

Сам по себе не так, но вам, вероятно, лучше использовать fscanf(stdin, "%d", &tmp) (если вы кодировали C, читайте дальше).

Многие из этих проблем связаны с тем, что ваш код очень похож на C. Нет никаких причин (если это не домашняя работа) самостоятельно управлять таким количеством выделений в C ++. Вот небольшой пример, который показывает более C ++ - способ сделать некоторые вещи:

#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::cout << "Number of elements to read? " << std::flush;

    // How many lines should we read?
    int count;
    if (!(std::cin >> count) || count <= 0) {
        std::cout << "Invalid element count" << std::endl;
        return 1;
    }


    std::string line;
    std::vector<std::string> lines;

    // Read until EOF (to get newline from above reading)
    if (!std::getline(std::cin, line)) {
        std::cout << "Error reading line" << std::endl;
        return 1;
    }

    // Read lines one at a time adding them to the 'lines' vector
    for (int i = 0; i < count; i++) {
        if (!std::getline(std::cin, line)) {
            std::cout << "Error reading line" << std::endl;
            return 1;    
        }
        lines.push_back(line);
    }

    // Echo the lines back
    for (std::vector<std::string>::const_iterator line_iterator = lines.begin(); line_iterator != lines.end(); ++line_iterator) {
        std::cout << *line_iterator << '\n';
    }
    return 0;
}
...