我需要知道如何将 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() 发布代码。这是非标准的,并且不会与大多数编译器一起编译。我现在为你修好了。同样,请不要发布不必要地使用非标准标头的代码,例如&lt;stdafx.h&gt;。这些不能轻易删除,因为代码可能取决于它们的内容,并且它们会阻止读者尝试您的代码。 strcpy_s(line2, line);? 你明白为什么changeRev 函数似乎不起作用了吗?您是否知道如何通过复制输入行来解决问题——如果您知道如何复制一行? 你想解决什么问题? @Beta-我知道它为什么不起作用并且我得到了 changeDown 函数的反面,但不知道如何纠正它。这就是我试图解决的问题——复制输入行。我在 C++ 编程的第二学期,完全没有任何经验。看似如此简单的事情对我来说并非如此。 @Alf-我按照我的导师告诉我的去做。他设置了 void main()。 是 Visual Studio Win32ConsoleApplication 的必需标头,我需要使用它。 【参考方案1】:

包含:“使用命名空间 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 字符串从一个变量复制到另一个变量,以便让第三个函数在我的程序中工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在Matlab中将数据从一个文本文件复制到另一个文本文件

在C中将奇数索引元素从一个数组复制到另一个数组

如何将文件复制到另一个路径?

将局部变量从一个函数传递到另一个函数

如何将变量从一个剃须刀页面传递到另一个?

如何将值从一个php页面传递到另一个? [复制]