2015-07-28 3 views
-2

я должен прочитать в этой строке: efBZw WH EDC EVOH qjfzJ oXkXL QUHXWMl kXRSIyGHb TxQkBWhPI yPTJEZ KyYfFQR ZQvYBPUmZ bkuKbRBWW Mjj WRgIBFNM ojGP XbkJNUhXF SeZVBZ SooFP XXE VIebym gOXP pDXRQЕсть ли какой-либо конкретный способ использования getline для строкового типа данных в C++ для чтения в строке из 540 символов?

Нет выхода для данной строки.

#include <iostream> 
    #include <string> 
    #include <ctype.h> 
    #include <deque> 

    using namespace std; 

    int isPiSong(string str,deque<int> numbers){ 
     int noOfwords = 0, noOfletters = 0, ctr = 0; 
     int flag = 1; 
     for(std::string::iterator it = str.begin(); it != str.end(); ++it) { 

      if(*it != ' ' && flag){ 
       if(isalpha(*it)) 
       noOfletters++; 
      } 
      else{ 
       if(noOfletters != numbers[ctr++]) 
        flag = 0; 
       noOfletters = 0; 
      } 

     } 
     return flag; 
    } 

    int main() 
    { 
     deque<int> numbers; 
       // 31415926535897932384626433833 
     numbers.push_back(3); 
     numbers.push_back(1); 
     numbers.push_back(4); 
     numbers.push_back(1); 
     numbers.push_back(5); 
     numbers.push_back(9); 
     numbers.push_back(2); 
     numbers.push_back(6); 
     numbers.push_back(5); 
     numbers.push_back(3); 
     numbers.push_back(5); 
     numbers.push_back(8); 
     numbers.push_back(9); 
     numbers.push_back(7); 
     numbers.push_back(9); 
     numbers.push_back(3); 
     numbers.push_back(2); 
     numbers.push_back(3); 
     numbers.push_back(8); 
     numbers.push_back(4); 
     numbers.push_back(6); 
     numbers.push_back(2); 
     numbers.push_back(6); 
     numbers.push_back(4); 
     numbers.push_back(3); 
     numbers.push_back(3); 
     numbers.push_back(8); 
     numbers.push_back(3); 
     numbers.push_back(3); 

     int T, flag; 
     cin>>T; 

     string* pisong = new string[T]; 

     for(int i = 0; i < T; i++){ 
      getline(cin>>ws, pisong[i]); //cin >> ws gets rid of leading whitespace 
             //first so that getline won't think that it's already       //reached the end of the line 
             //It doesn't seem to take the above input string 
     } 

     for(int i = 0; i < T; i++){ 
      flag = isPiSong(pisong[i],numbers); 
      if(flag){ 
       cout<<"It's a pi song."<<endl; 
      }else{ 
       cout<<"It's not a pi song."<<endl; 
      } 
     } 
     delete [] pisong; 
     return 0; 
    } 
+0

Здравствуйте, добро пожаловать в переполнение стека! Чтобы получить хорошие ответы, вам нужно будет обновить свой вопрос с дополнительной информацией. «Невозможно взять указанную строку в качестве входных данных», это не описание проблемы. Пожалуйста, прочитайте [это] (http://stackoverflow.com/help/how-to-ask) и [это] (http://stackoverflow.com/help/mcve). – Anders

ответ

0

Вы хотите установить valgrind и использовать его. Он сразу же раскрывает эту проблему:

==6962== Conditional jump or move depends on uninitialised value(s) 
==6962== at 0x40117D: isPiSong(std::string, std::deque<int, std::allocator<int> >) (stackoverflow-31686882.cpp:19) 
==6962== by 0x401670: main (stackoverflow-31686882.cpp:77) 
==6962== 
==6962== Use of uninitialised value of size 8 
==6962== at 0x401173: isPiSong(std::string, std::deque<int, std::allocator<int> >) (stackoverflow-31686882.cpp:19) 
==6962== by 0x401670: main (stackoverflow-31686882.cpp:77) 
==6962== 
==6962== Invalid read of size 4 
==6962== at 0x401173: isPiSong(std::string, std::deque<int, std::allocator<int> >) (stackoverflow-31686882.cpp:19) 
==6962== by 0x401670: main (stackoverflow-31686882.cpp:77) 
==6962== Address 0x0 is not stack'd, malloc'd or (recently) free'd 
==6962== 
==6962== 
==6962== Process terminating with default action of signal 11 (SIGSEGV) 
==6962== Access not within mapped region at address 0x0 
==6962== at 0x401173: isPiSong(std::string, std::deque<int, std::allocator<int> >) (stackoverflow-31686882.cpp:19) 
==6962== by 0x401670: main (stackoverflow-31686882.cpp:77) 

Line 19 является это одна:

if(noOfletters != numbers[ctr++]) 

СУУ увеличивается для каждого отдельного пространства. Как только число deque исчерпано (т. Е. Длина ctr>), вы получаете незаконный доступ в deque. Таким образом, либо вам нужно сбросить ctr до нуля в какой-то момент, либо вам нужно проверить, чтобы ctr не был слишком большим.

Кроме того, есть много возможностей для улучшения.

Как только флаг установлен на ноль, он больше не может меняться и поэтому в какой-то момент вы вернете false. Итак, почему бы просто не сразу вернуться? Итак, вместо флага = 0 просто верните 0.

Сначала вы подсчитываете количество букв, затем, когда вы достигаете следующего места, вы проверяете его. Что, если вы дадите эту строку: «abc a abcd xxxxxxxxxxxxxxxx»? Подождите, дайте мне проверить:

It's a pi song. [abc a abcd xxxxxxxxxxxxxxxx] 

Только если я добавить пробел после последнего х, программа корректно распознает ошибку:

It's not a pi song. [abc a abcd xxxxxxxxxxxxxxxx ] 

Решение: После того, как вы обнаружили первый IsAlpha характер, установите некоторые n = числа [ctr ++] - 1 (после проверки, что есть числа слева). Затем для каждой следующей isalpha do n-- и проверьте, было ли это раньше (т. Е. «If (n--) {...}». Если это было -> return 0. Если нет, продолжайте до пробела. тест будет проверять n до достижения нулевого значения (это означает, что точно цифры [ctr ++] isalphas были пропущены). Если нет -> возврат 0.

Наконец, вы должны решить, что делать, если число deque равно

+0

Спасибо, я пробовал сейчас . Это было дано в тестовых случаях e, что число слов в вводе типа строки не будет превышать 29 слов. Следовательно, я небрежно относился к концу дела в deque. – Sitansu

+0

Правило номер один в разработке программного обеспечения: никогда не доверяйте своим входным данным. –