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