c ++ c-strings,strncat,strncpy

时间:2013-04-23 16:19:50

标签: c++ while-loop strcpy strncpy

这个程序应该输入某个人的名字并输出它像“Last,first middle”。这些名称应该存储在3个不同的数组中,它们是最后一个全名的第四个数组。我也应该使用strncpy和strncat来构建第四个数组。我的问题是我不知道在这种情况下strncpy的用途以及如何使用它。我可以让程序说“第一个中间最后一个”但不是正确的输出。我遇到的另一个问题是,while循环应该允许用户说“q”或“Q”并退出程序,但它不会这样做

#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;
}

1 个答案:

答案 0 :(得分:1)

由于以下几个原因,你的while循环不起作用:

  • 您实际上是在查看firstName数组(firstName[SIZE])的末尾而不是第一个字符(firstName[0])。
  • 您没有检查以确保firstName 一个字符qQ
  • 你只是在循环之前要求第一个名字,而不是每个循环。

您对strncpy的来电看起来不正确。如上所述,您将使用姓氏并将其复制到firstName,从而销毁您刚刚连接在一起的第一个和中间名称。就像@ steve-jessop所说的那样,在fullName中汇总全名。

你可能假设使用strncpystrncat,因为这是一个人为的示例/练习,其中全名的缓冲区大小有限,所以某些名称组合不适合,需要截断。