2016-06-16 2 views
1

Я не могу решить проблему с этой программой.Почему эта программа пропускает цикл?

#include <iostream> 

using namespace std; 

int main(){ 

    int t; 
    char s[5]; 

    cin>>t; 
    cin>>s; 

    while(t--){ 

     char f[100]; 

     cin>>f; 

     cout<<f<<endl; 
    } 

    return 0; 
} 

Выход:

5 abcde 
Process returned 0 (0x0) execution time : 4.100 s 
Press any key to continue.

Я думаю, он должен попросить строки ф пять раз и напечатать строку F в пять раз до окончания.

Может ли кто-нибудь помочь мне избавиться от этой проблемы?

Спасибо

+0

Можете ли вы предоставить вывод, когда строка 'length <= 4' введена для' s' (например, 'abcd') –

ответ

3

Учитывая завершающий нулевой символ, строка 5 символов слишком долго, чтобы вписаться в char s[5];. В этом случае t кажется произошло, которое должно быть сразу после s в памяти, и ваша машина использует мало endian, поэтому завершающий нуль-символ, значение которого равен 0, перезаписывается младшим байтом t и значением tпроизошло равным нулю.

Чтобы избежать этого, вы должны использовать std::string вместо массивов char так:

#include <iostream> 
#include <string> 

using namespace std; 

int main(){ 

    int t; 
    string s; 

    cin>>t; 
    cin>>s; 

    while(t--){ 

     string f; 

     cin>>f; 

     cout<<f<<endl; 
    } 

    return 0; 
} 

При использовании массивов char требуется, сделать входные строки достаточно короткий или увеличить размер буфера для того, чтобы он хранить все возможный ввод без переполнения буфера.

+1

Для чтения в массив символов' getline' часто бывает лучше, так как требуется аргумент длины. – drRobertz

+0

Хороший ответ @mikecat –