【问题标题】:c++ c-strings, strncat, strncpy时间:2019-01-01 标签:c++c-strings,strncat,strncpy
【发布时间】:2013-04-16 23:09:21
【问题描述】:

这个程序应该输入某人的名字并像“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;
}

【问题讨论】:

  • 如果是 C++,不要使用char *,而是使用std::string。如果是 C,不要使用std::cin,而是使用fgets()
  • 提示:你的代码应该将结果组装到fullName。也许应该将其定义为足够大以包含所有三个组件,但是如果它足够大,那么使用 strn 函数将毫无意义,因此您将不会学到本练习应该教给您的任何内容.
  • @Steve Jessop 但是我为什么要在这里使用 strncpy 或 strcpy 呢?
  • @user1807815:我个人不会。我假设您已被告知要了解它们的工作原理。手头的基本问题是您有三个字符串,每个最多 50 个字符长,并且您试图将它们连接成一个只有 50 个字符长的数组,因此可能比它们的总长度短。所以 something 必须检查大小以避免超出缓冲区。 strncpystrncat 提供了一些尺寸检查,因此(在胁迫下)可以使用它们来执行此操作。但是它们有很多限制,基本上不值得。
  • @user1807815:对,所以不要这样做 strncpy(middleName, firstName, ...) 。首先决定什么应该去哪里(考虑到我上面的提示),然后对于你要实施的每一件事,决定是使用strncpy还是strncat来实现它。

标签: c++ while-loop strcpy strncpy


【解决方案1】:

您的 while 循环无法正常工作,原因如下:

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

您拨打strncpy 的电话看起来不对。如所写,您将取姓氏并将其复制到firstName,从而破坏您刚刚在此处连接在一起的名字和中间名。就像@steve-jessop 说的,把全名拼到fullName

您可能应该使用strncpystrncat,因为这是一个人为的示例/练习,其中采用全名的缓冲区大小有限,因此某些名称组合将不适合,需要截断。

【讨论】:

  • 谢谢,所以我修复了程序,它完成了它应该做的事情,但名称输出为“LastFirstMiddle”,而不是“Last,First Middle”。你知道如何在它们之间放置空格或逗号吗?
  • 在连接各部分之间,连接构成空格和逗号的小字符串。再次使用strncat,这次你连接的是", "" "
猜你喜欢
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多