【问题标题】:Problem removing a character from char array从 char 数组中删除字符的问题
【发布时间】:2020-08-27 05:47:04
【问题描述】:

我正在编写一个程序来从字符数组中删除字符“&”(如果存在)并显示输出。 这是我的代码:

#include <iostream>
#include <string>
using namespace std;

void decrypt(char mess[1024])
{
    int i = 0;
    int decmp = 0;
    int len = strlen(mess);
    char decmess[256] = {0};
    while (i < len)
    {
        if (strcmp(&mess[i], "&") ==    0) {
            i++;
        } else {
            decmess[decmp] = mess[i];
            i++;
            decmp++;
        }
    }
    cout << decmess <<  endl;
}
int main(int argc, char *argv[])
{
    char encmess[1024] = {0};
    cout << "Enter message to decrypt" << endl;
    cin.getline(encmess, 1024);
    decrypt(encmess);
}

但它只是不工作只有“&”从字符串的最后一个被删除(如果存在)。

示例输入/输出:

input: sg&shx&f
output: sg&sh&f
input: dh&st&
output: dh&st

请帮忙!!!

【问题讨论】:

  • strcmp(&mess[i], "&"). &mess[i] 是混乱索引 i 的地址。觉得应该是一团糟[i]
  • if (strcmp(&amp;mess[i], "&amp;") == 0) 更改为if (mess[i] =='&amp;')
  • 如果这确实是一个 C++ 问题,请使用 &lt;string&gt;&lt;algorithm&gt;

标签: c++ arrays char


【解决方案1】:

您将strlen()char[]#include &lt;string&gt; 混合在一起使事情变得过于复杂。你依赖于初始化而不是肯定地终止decmess,你不需要strcmp()来比较单个字符。

看来你想做:

#define MAXC 1024           /* if you need a constant, #define one (or more) */

void decrypt(char *mess)
{
    char decmess[MAXC] = "";
    int i = 0, decmp = 0;
    
    for (; mess[i]; i++)
        if (mess[i] != '&')
            decmess[decmp++] = mess[i];
    
    decmess[decmp] = 0;     /* affirmatively nul-terminate despite initialization */
    
    std::cout << decmess << '\n';
}

(注意: C 字符串是 nul-terminated 在迭代它包含的字符之前不需要获取长度,只需循环直到找到空字符(ASCII 0)。另外,不带参数的main() 只是int main()int main(void)

至于为什么你所做的没有工作,strcmp(&amp;mess[i], "&amp;")&amp;mess 中剩余的内容进行比较,从mess + i 开始,所以你永远不会单独匹配'&amp;'&amp;mess[i] 只是指向mess 中第 ith 字符的指针,使用 strcmp 从该位置到字符串末尾与 "&amp;" 进行比较。 (您可以使用strncmp(&amp;mess[i], "&amp;", 1) 来限制它——但这对于if (mess[i] == '&amp;') 来说是多余的

添加你的短 main() 你会得到:

#include <iostream>

#define MAXC 1024           /* if you need a constant, #define one (or more) */

void decrypt(char *mess)
{
    char decmess[MAXC] = "";
    int i = 0, decmp = 0;
    
    for (; mess[i]; i++)
        if (mess[i] != '&')
            decmess[decmp++] = mess[i];
    
    decmess[decmp] = 0;     /* affirmatively nul-terminate despite initialization */
    
    std::cout << decmess << '\n';
}

int main(void)
{
    char encmess[MAXC] = "";
    
    std::cout << "Enter message to decrypt" << '\n';
    std::cin.getline(encmess, MAXC);
    
    decrypt(encmess);
}

注意:参见:Why is “using namespace std;” considered bad practice?C++: “std::endl” vs “\n”

使用/输出示例

$ ./bin/decmess
Enter message to decrypt
sg&shx&f
sgshxf

如果您还有其他问题,请告诉我。

【讨论】:

  • 是的,它有效,并且修复了错误。我是编程新手,所以我大部分时间都在写复杂的东西。
  • 没问题,求精是有经验的。先让它工作——然后改进:)
  • 当然strcmp(&amp;mess[i], "&amp;"&amp;mess 中剩余的内容进行比较,从mess + i 开始,所以你永远不会匹配'&amp;'(你可以这样做strncmp (&amp;mess[i], "&amp;", 1)——但是为什么)跨度>
【解决方案2】:

因为您使用 c++ 标记了您的问题,所以这是 c++ 的方式:

#include <algorithm>
#include <string>

void decrypt(std::string& mess)
{
    mess.erase(std::remove_if(mess.begin(), mess.end(), [](auto c) {return c == '&'; }), mess.end());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 2015-01-12
    • 2021-10-10
    • 2014-03-20
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多