【问题标题】:this code is not working for {"parses", "parsecs"}此代码不适用于 {"parses", "parsecs"}
【发布时间】:2019-12-23 13:55:26
【问题描述】:
#include<iostream>
#include<vector>
#include<string>

using namespace std;
bool letterCheck(vector<string> arr)
{
    int b=0;
    int l1=arr[0].length();
    int l2=arr[1].length();
    for(int i=0;i<l1;i++)
    {
        for(int j=0;j<l2;j++)
        {
            if(tolower(arr[1][i])==tolower(arr[0][j]))
            b++;
        }
    }
    if(b<arr[1].length())
        return false;
    else return true;
}


int main()
{
    vector <string> v={"parses", "parsecs"};
    cout<<letterCheck(v);
    return 0;
}

这是一个接受两个字符串数组并检查第二个字符串中的字母是否存在于第一个字符串中的程序。

示例: letterCheck(["trance", "nectar"]) ➞ true

letterCheck(["compadres", "DRAPES"]) ➞ true

letterCheck(["parses", "parsecs"]) ➞ false

该程序适用于上述给定的对。它为 {"parses", "parsecs"} 返回 true,但它应该返回 false。 谁能告诉我,代码中的问题是什么?我可以做些什么来消除这个问题?

【问题讨论】:

  • 您是否尝试过在调试器中逐句逐句执行代码?如果这样做,它的行为是否符合您的预期?
  • 如果长度不相等,您可以通过返回 false 来缩短所有这些操作,然后在找到一对不同字符的元素后立即返回 false(之后转换为小写)
  • 顺便说一句,这个条件在你的循环中被不必要地检查了两次:if(tolower(arr[0][i])==tolower(arr[1][j]))
  • 你试过一步步调试你的程序吗?这就是我在第二步中所做的。 (第一步是盯着它看。有时它会有所帮助,有时我不得不退回到调试。)
  • 另一边:如果您期望恰好有两个元素,请让您的参数反映这一点。现在它可能需要 0、1、2 或一百万个元素。对于 0 和 1 值,您有 UB

标签: c++ arrays string


【解决方案1】:

直接的问题是您尝试计算匹配字符以查看第二个字符串中的所有字符是否与第一个字符串中的匹配。然而,由于第一个字符串中有重复的字符,计算会出错:两个’s’ 的存在使b 比你想要的大。一旦你找到一个角色,你就可以跳出循环来避免这个问题。

顺便说一句,将未经检查的char 传递给tolower() 可能会给您带来未定义的行为:在大多数平台上,char 已签名,但tolower() 有一个前提条件,即要求参数为 nin-negative 或 @987654327 @。

另外,b &lt; arr[1].length() 的结果是bool(虽然它需要 ro 反转):不需要写一个花哨的条件来把它变成布尔值。

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多