2013-04-23 3 views
0

Эта программа должна вводить имя someones и выводить ее как «Last, first middle». Предполагается, что имена хранятся в трех разных массивах, а их четвертый массив для полного имени в конце. Я также должен использовать strncpy и strncat для построения четвертого массива. Моя проблема заключается в том, что я не знаю, что будет использовать strncpy в этой ситуации и как ее использовать. Я могу заставить программу сказать «first middle last», но не правильный вывод. Другой вопрос, им того, как цикл в то время, как предполагается, чтобы позволить пользователю говорить «Q» или «Q» и выйти из программы, но это не делает этоC++ c-strings, strncat, strncpy

#include <iomanip> 
#include <iostream> 
#include <cctype> 
using namespace std; 

int main() 
{ 
char replay; //To hold Q for quit 

const int SIZE = 51; 
char firstName[SIZE]; // To hole first name 
char middleName[SIZE]; // To hold middle name 
char lastName[SIZE]; // To hold last name 
char fullName[SIZE]; //To hold the full name 
int count = 0; 
int maxChars1; 
int maxChars2; 



cout << "Enter Q to quit or enter your first name of no more than " << (SIZE - 1) 
    << " letters: "; 
cin.getline(firstName, SIZE); 

while(firstName[SIZE] != 'Q' || firstName[SIZE] != 'q') 
{ 
cout << "\nEnter your middle name of no more than " << (SIZE - 1) 
    << " letters: "; 
cin.getline(middleName, SIZE); 

cout << "\nEnter your last name of no more than " << (SIZE - 1) 
    << " letters: "; 
cin.getline(lastName, SIZE); 

maxChars1 = sizeof(firstName) - (strlen(firstName) + 1); 
strncat(firstName, middleName, maxChars1); 

cout << firstName << endl; 

maxChars2 = sizeof(lastName) - 1; 
strncpy(firstName, lastName, maxChars2); 
lastName[maxChars2] = '\0'; 

cout << lastName << endl; 
    } 

system("pause"); 
return 0; 
} 
+2

Если C++, не используйте 'char *', а 'std :: string'. Если C, не используйте 'std :: cin', а' fgets() '. – 2013-04-23 16:21:01

+1

Подсказка: ваш код должен собрать результат в 'fullName'. Который, возможно, должен быть определен достаточно большим, чтобы содержать все три компонента, но опять же, если он был достаточно большим, то не было бы смысла использовать функции 'strn', поэтому вы не узнали бы, что это упражнение должно научить вас , –

+0

@Steve Jessop Но зачем вообще использовать strncpy или strcpy? – user1807815

ответ

1

Ваш цикл, пока не работает по нескольким причинам :

  • Вы на самом деле выглядящий мимо конца firstName массива (firstName[SIZE]), а не первый символ (firstName[0]).
  • Вы не проверяете, чтобы firstName был только один символ q или Q.
  • Вы запрашиваете только одно имя, прежде чем цикл, а не каждый цикл.

Ваш звонок strncpy не выглядит правильным. Как написано, вы берете фамилию и копируете ее до firstName, уничтожая первые и средние имена, которые вы просто конкатенировали вместе. Как @ steve-jessop сказал, соберите полное имя в fullName.

Вы, вероятно, предполагается использовать strncpy и strncat, потому что это надуманный пример/упражнения, где буфер принимает полное имя имеет ограниченный размер, поэтому некоторые комбинации имен не будет соответствовать, и должны быть усечены ,

+0

Спасибо, поэтому я исправил программу, и она делает то, что она должна делать, но название выводится как «LastFirstMiddle», а не «Last, First Middle». Вы знаете, как помещать пробелы или запятые между ними? – user1807815

+0

Между конкатенированием частей объединяются небольшие строки, которые образуют пробелы и запятые. Снова используйте 'strncat', на этот раз вы объединяете' ',' 'и' '' '. –

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