2014-03-07 3 views
1

Выполнение задачи программы сообщений и возникла проблема, которую я не понимаю с помощью буфера. Ответ, который я уверен, действительно прост, но я просто не могу обернуть его вокруг. Я пытаюсь попросить пользователя ввести 10-значное имя, которое будет работать как имя пользователя.массив символов, хранящий слишком много символов? (C++)

char myID[11]; // stores 10 characters plus newline at the end 
char sendBuff[1024] 

cout << "Enter your nickname(10 digits): "; 
cin >> myID; 
cin.ignore(1000, '\n'); //clears buffer, or so I thought 

Тогда я получить фактический текст сообщения, хранить его в tempCharArray, а затем объединить имя и текст сообщения с помощью sprintf_s.

char tempCharArray[1024]; 
cin.getline(tempCharArray, 1024);     

sprintf_s(sendBuff, 1024, "%s: %s", myID, tempCharArray); //combines username and message text into one line before being printed 

Теперь моя проблема заключается в том, что если я ввожу имя длиннее 10 цифр, он печатает полное имя в функции sprintf_s, несмотря на MyId быть только 10 символов. Я совсем не понимаю этого поведения ...

Например, если я нахожу «HelloKitty69420» в myID, а затем «yoyoyo» в tempCharArray, я бы ожидал, что он напечатает «HelloKitty: yoyoyo», потому что myID может только удерживайте 10 символов, но он печатает «HelloKitty69420: yoyoyo».

Что происходит?

ответ

0

Я бы прокомментировал вашу общую стратегию для достижения вашей цели (то есть, это определенно не так, как я бы это сделал), но я сосредоточусь на ответе.

Во-первых, вы должны использовать std::cin.width(10), чтобы ограничить количество символов, фактически сохраненных и перенесенных в myID.

Во-вторых, вам, похоже, повезло в вышеуказанном случае. Байты переполнения были записаны во второй массив sendBuff, а sprintf записывал символы из myID и sendBuff.

Причина, по которой байты переполнения были записаны во второй массив, заключается в том, что компилятор просто поместил myID и sendBuff в области памяти, которые были смежными. т.е. myID [1000] будет таким же, как sendBuff [1000-11]

+0

Исправить и просто добавить, когда вы делаете cout, он печатает символы, пока не достигнет символа EOL. Не имеет значения, что массив символов имеет длину 10 и что есть утечка памяти. Как говорит stackmate, вам решать, чтобы в массив попало всего 10 символов. – Dave

+0

О, я не знал о cin.width, спасибо вам большое. Не стесняйтесь прокомментировать мой подход, если хотите. Также мне очень любопытно, почему дополнительная информация записывается в sendBuff? – user3394004

Смежные вопросы