【发布时间】: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