Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using cin for char array

Tags:

c++

arrays

char

cin

Here is my code:

#include <iostream>
using namespace std;

int main(){
    char inp[5], out[4];
    cin >> inp >> out;
    cout << inp << endl;
    cout << out << endl;
    system("pause");
    return 0;
}

when I type:

12345 6789

It gives me:

6789

Why I failed to save the 5 words char array 'inp' and it showed nothing? The second input looks normal though. However, when I set out[3] or out[5], it seems to work alright? It seem that two char array of [5] then followed by [4] would cause problem...

like image 757
ken Avatar asked Oct 19 '25 15:10

ken


2 Answers

I see that you enter (type) 1234567890 characters to input data for inp[5] - it is a problem because imp array is able to store 4 characters and null-terminator. When cin >> inp store more than 4 characters to inp array it leads to problem with data (somthing like undefined behaviour). So solution can be in allocation more memory for data, e.g.:

    #include <iostream>
    using namespace std;

    int main(){
        char inp[15], out[15];  // more memory
        cin >> inp >> out;
        cout << inp << endl;
        cout << out << endl;
        system("pause");
        return 0;
    }
like image 62
VolAnd Avatar answered Oct 21 '25 06:10

VolAnd


When you read into a character array the stream keeps reading until it encounters whitespace, the stream is not aware of the size of the array that you pass in so happily writes past the end of the array so if your first string is longer than 4 characters your program will have undefined behaviour (an extra character is used after your input for the null terminator).

Fortunately c++20 has fixed this issue and the stream operators no longer accept raw char pointers and only accept arrays and will only read up to size - 1 characters.

Even with c++20 the better solution is to change your types to std::string which will accept any number of characters end even tell you how many characters it contains:

#include <iostream>

int main(){
    std::string inp, out;
    std::cin >> inp >> out;
    std::cout << inp << "\n";
    std::cout << out << "\n";
    return 0;
}
like image 22
Alan Birtles Avatar answered Oct 21 '25 04:10

Alan Birtles