我需要知道如何将 c 字符串从一个变量复制到另一个变量,以便让第三个函数在我的程序中工作
Posted
技术标签:
【中文标题】我需要知道如何将 c 字符串从一个变量复制到另一个变量,以便让第三个函数在我的程序中工作【英文标题】:I need to know how to copy a c-string from one varible to another in order to get a third function to work in my program 【发布时间】:2016-02-10 01:39:13 【问题描述】:我正在尝试为一个作业编写三个函数
changeUp
将字符串更改为大写
changeDown
将字符串更改为小写
changeRev
反转每个字符的大小写
每个函数都必须接受 指向字符串或 C 字符串的指针作为参数,并且必须通过迭代输入字符串中的每个字符来进行上述更改。
输入AbCd
时,第一个函数应该返回ABCD
;第二个函数应该返回abcd
;并且反向函数应该返回aBcD
。
我不知道如何让最后一个函数工作 - 它只返回所有大写字母。
我已经尝试将输入复制到一个变量来保存它 - 你可以看到我尝试这样做的注释掉的区域,但我真的不知道我在做什么,我只是诚实的。尝试复制(行,行2)时出现各种错误。
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
void changeUp(char *line)//Change to upper case
for (int i = 0; line[i]; i++)
if (islower(line[i])) line[i] = toupper(line[i]);
void changeDown(char *line)//Change to lower case
for (int i = 0; line[i]; i++)
if (isupper(line[i])) line[i] = tolower(line[i]);
void changeRev(char *line)//Reverse the cases
for (int i = 0; line[i]; i++)
if (isupper(line[i])) line[i] = tolower(line[i]);
else if (islower(line[i])) line[i] = toupper(line[i]);
void main()
const int SIZE = 81; //For character space
char line[SIZE], line2[SIZE];//Character array
cout << "Enter a string of characters :" <<endl;//Takestring input from user
cin.getline(line, SIZE);
//strcpy_s(line, line2);
changeUp(line);
cout << "Changed to Upper Case " << line << endl;//Output string in all caps
//strcpy_s(line, line2);
changeDown(line);
cout << "Changed to Lower Case " << line << endl;//Output string in lower case
//strcpy_s(line, line2);
changeRev(line);
cout << "The rverse of the characters is " << line << endl;//Output reverse of string entered
system("pause");
return;
【问题讨论】:
请不要使用void main()
发布代码。这是非标准的,并且不会与大多数编译器一起编译。我现在为你修好了。同样,请不要发布不必要地使用非标准标头的代码,例如<stdafx.h>
。这些不能轻易删除,因为代码可能取决于它们的内容,并且它们会阻止读者尝试您的代码。
strcpy_s(line2, line);
?
你明白为什么changeRev
函数似乎不起作用了吗?您是否知道如何通过复制输入行来解决问题——如果您知道如何复制一行? 你想解决什么问题?
@Beta-我知道它为什么不起作用并且我得到了 changeDown 函数的反面,但不知道如何纠正它。这就是我试图解决的问题——复制输入行。我在 C++ 编程的第二学期,完全没有任何经验。看似如此简单的事情对我来说并非如此。
@Alf-我按照我的导师告诉我的去做。他设置了 void main()。 包含:“使用命名空间 std”是不好的做法,最好使用 std::cout 并且适用于该命名空间中的所有函数。此外,您正在发送一个指向函数的指针,因此每次每个函数都在修改字符串时,因此在您的反向条件之前,您传递所有小写字母,因此这就是您获得全部大写字母的原因。我认为像下面的解决方案会是更好的方法。
#include <iostream>
#include <string>
using namespace std;
string changeUp(string line)//Change to upper case
for (int i = 0; line[i]; i++)
if (islower(line[i])) line[i] = toupper(line[i]);
return line;
string changeDown(string line)//Change to lower case
for (int i = 0; line[i]; i++)
if (isupper(line[i])) line[i] = tolower(line[i]);
return line;
string changeRev(string line)//Reverse the cases
for (int i = 0; line[i]; i++)
if (isupper(line[i])) line[i] = tolower(line[i]);
else if (islower(line[i])) line[i] = toupper(line[i]);
return line;
void main()
const int SIZE = 81; //For character space
char line[SIZE], line2[SIZE];//Character array
cout << "Enter a string of characters :" << endl;//Takestring input from user
cin.getline(line, SIZE);
//strcpy_s(line, line2);
cout << "Changed to Upper Case " << changeUp(line) << endl;//Output string in all caps
//strcpy_s(line, line2);
cout << "Changed to Lower Case " << changeDown(line) << endl;//Output string in lower case
//strcpy_s(line, line2);
cout << "The rverse of the characters is " << changeRev(line) << endl;//Output reverse of string entered
system("pause");
return;
【讨论】:
对不起,我大量编辑了 OP 漫无边际的原始问题,并省略了一个重要细节 - 即这些函数必须接受指向字符串而不是纯字符串的指针。我的错……【参考方案2】:你快到了。问题是您正在对同一个变量进行操作,并且每次在其上运行函数时都会覆盖输入 line
。当您运行changeRev
时,您将使用changeDown
将输入字符串的结果“反转”为小写。反转这个字符串自然会使其全部大写。
创建一个副本是正确的做法,但是您刚刚弄错了参数的顺序。目的地第一,源头第二。然后确保只对副本进行操作,line2
,以便用户的原始输入在 line
变量中保持不变,以便您以后可以再次使用它。
strcpy_s(line2, line);
changeUp(line2);
cout << "Changed to Upper Case " << line2 << endl;/
strcpy_s(line2, line);
changeDown(line2);
cout << "Changed to Lower Case " << line2 << endl;
strcpy_s(line2, line);
changeRev(line2);
cout << "The reverse of the characters is " << line2 << endl;
【讨论】:
谢谢谢谢谢谢!我知道它必须是一些简单的东西,但我就是无法得到它。做到了! @Jesse Good - 现在从中吸取教训,当您不确定事情时,您应该始终read the documentation。使用调试器单步执行通常可以帮助解决其余的问题。 ;) @J...:更重要的一课是尽可能地独立开发新功能。你想复制一个字符串;你试图在一个大的、故障的程序的上下文中复制一个字符串。如果你硬编码了两个字符串,试图将一个复制到另一个中,然后将它们都打印出来,那么你会在两分钟内解决问题(即使文档有误,因为它偶尔会出错)。 @Beta 点和点。一次做一件事,测试,测试,测试!【参考方案3】:原因是函数正在就地修改字符串。因此字符串来自AbCd
=> ABCD
=> abcd
=> ABCD
。您在第一次调用中丢失了原始字符串。
解决方法是每次都对字符串进行拷贝,并在拷贝上调用函数。
【讨论】:
以上是关于我需要知道如何将 c 字符串从一个变量复制到另一个变量,以便让第三个函数在我的程序中工作的主要内容,如果未能解决你的问题,请参考以下文章