C++ c++;c字符串,strncat,strncpy

C++ c++;c字符串,strncat,strncpy,c++,while-loop,strcpy,strncpy,C++,While Loop,Strcpy,Strncpy,这个程序应该输入某人的名字,然后像“Last,first middle”一样输出。这些名称应该存储在3个不同的数组中,它们的末尾是全名的第四个数组。我还应该使用strncpy和strncat来构建第四个阵列。我的问题是我不知道在这种情况下strncpy的用途是什么以及如何使用它。我可以让程序显示“first middle last”,但输出不正确。我遇到的另一个问题是while循环应该允许用户说“q”或“q”并退出程序,但它没有做到这一点 #include <iomanip> #in

这个程序应该输入某人的名字,然后像“Last,first middle”一样输出。这些名称应该存储在3个不同的数组中,它们的末尾是全名的第四个数组。我还应该使用strncpy和strncat来构建第四个阵列。我的问题是我不知道在这种情况下strncpy的用途是什么以及如何使用它。我可以让程序显示“first middle last”,但输出不正确。我遇到的另一个问题是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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
char replay;//保留Q以退出
常数int SIZE=51;
char firstName[大小];//到孔的名字
char middleName[SIZE];//保存中间名
char lastName[SIZE];//保存姓氏
char fullName[SIZE];//保存全名
整数计数=0;
int-maxChars1;
int-maxChars2;

cout由于以下几个原因,您的while循环无法工作:

  • 实际上,您看到的是一个超过
    firstName
    数组(
    firstName[SIZE]
    )末尾的字符,而不是第一个字符(
    firstName[0]
  • 您没有检查以确保
    firstName
    一个字符
    q
    q
  • 在循环之前,您只需要询问一次名字,而不是每次循环
您对
strncpy
的调用看起来不太正确。如前所述,您将姓氏复制到
firstName
,并销毁刚刚连接在一起的名字和中间名。如@steve jessop所说,在
fullName
中组合全名


你可能应该使用<代码> STRNCPY 和 STRCATA< /COD>因为这是一个设计的例子/练习,其中全名的缓冲区大小是有限制的,所以一些名称组合将不适合,需要截断。

如果C++不使用<代码> char */COD> >但是代码> STD::String 。如果C,不要使用<代码>td::cin
fgets()
。提示:您的代码应该在
fullName
中汇编结果。也许应该将其定义为足够大以包含所有三个组件,但是如果它足够大,那么使用
strn
函数就没有意义了,因此您将无法学习本练习应该教给您的任何内容。@SteveJessop但我为什么要在这里使用strncpy或strcpy?@user1807815:我个人不会。我想你是被告知要使用strncpy或strcpy的,以便了解它们是如何工作的。目前的基本问题是,你有三个字符串,每个字符串的长度不超过50个字符,你正试图将它们连接到一个只有50个字符的数组中,因此可能是shoRTE大于它们的总长度。因此必须检查大小以避免缓冲区溢出。
strncpy
strncat
提供一些大小检查,因此(在胁迫下)可以使用它们来执行此操作。但它们有太多限制,基本上不值得。@user1807815:对,所以不要执行
strncpy(middleName,firstName,…)
。首先决定应该放在哪里(考虑到我上面的提示),然后对于要放置的每件事情,决定是使用
strncpy
还是
strncat
将其放在那里。谢谢,所以我修复了该程序,它执行它应该执行的操作,但名称输出为“LastFirstMiddle”,而不是“Last,FirstMiddle”。你知道如何在它们之间放置空格或逗号吗?在连接部分之间,连接构成空格和逗号的小字符串。再次使用
strncat
,这次连接的是
,“
”。