【问题标题】:creating a function to match a string in the main创建一个函数来匹配 main 中的字符串
【发布时间】:2012-06-19 09:58:26
【问题描述】:

这是一项小组作业,我们的教授将项目延长了 1 周,这变得相当困难。有 50 个阶段/测试,我们只能达到第 11 阶段,然后功能失败。

这个函数在我们的 .cpp 文件中(我们肯定是这个函数导致了问题,因为当我们改变它的一部分时,它会影响我们已经通过的第 11 阶段)。

int segment::match(const char word[]) {
    int i;
    cout << data[0];
    data[0] == "OOP";
    cout << data[0];
    for(i=0;i<NUM_MAX;i++) {
        cout << "word = " << &word[i] << " data[i] = " << data[i];
        if(strstr(&word[i],data[i])!= NULL)
        break;
    }
       return i==NUM_MAX ? 1 : i-1;

从 main.cpp(作为作业提供给我们)这就是我们想要完成的目标

通过了测试 11...

Your match( ) return value ----> -1
Actual match( ) return value --> -1 
Press the ENTER key to continue... 
word = OOP data[i] = 

Failed while testing the match( ) 
function... Failed on test 12... 
Your match( ) return value ----> -1 
Actual match( ) return value --> 1 
Press the ENTER key to continue...

You passed 11/50 tests... 
Your program is 22.00% complete! 
Your program still needs some work! 
Keep at it!

该函数应该做的是检查“oop”,如果不存在则以 -1 退出,如果存在则应以 1 返回 true。

我想我要问的是如何使该函数以正确的顺序返回 -1 和 1?

如果您想访问 main.cpp 和 segement.cpp,我可以将它们作为文件上传到某个地方,因为它们很长,我不想塞满帖子。

感谢您的帮助,谢谢。

编辑* 这是我们拥有的完整代码 http://jsfiddle.net/h5aKN/

“html”部分包含我们构建的 segement.cpp。 jscript 部分有 a2main.cpp,这是我们教授构建的。

【问题讨论】:

  • data[0] == "OOP"; 那味道。
  • 我仍在努力更好地理解这个问题,因为这听起来很像一个简单的字符串匹配问题!!!
  • if(strstr(&amp;word[i],data[i])!= NULL) 可能不是正确的做法。
  • 您想在字符串的任何位置检测“oop”,还是只检测开头?
  • 缺少很多关于类型的信息。 C++ 是关于类型的。向我们展示类型。

标签: c++ string-matching


【解决方案1】:

data[0] == "OOP"; 可能不是您想要做的。双 = (==) 测试是否相等,所以在这里您要测试 data (data[0]) 的第一个索引处的项目和字符串 "OOP" 是否相等。

在运行测试时,您正在计算:word = OOP data[i] =,这意味着word[i] 可能已正确定义,但data[i] 未正确定义。这可以追溯到上面等价测试的用法。

如果你正确设置了初始化data,(正确的意思是正确分配内存,我不知道data是在哪里实例化的),那么测试可能会返回-1,因为它会得到一个非空指针从strstr() 调用(假设data 是正确的类型),ibreaking 上将是0,而三元运算符将产生i-1, = -1

所以修复data变量的初始化/赋值

如果您不限于 c 样式字符串(字符数组),我会使用 std::string 类型及其相关方法(如果您还没有,请参阅 the c++ string reference)。通常使用起来会更好

【讨论】:

  • 所以我将其更改为 data[0] = "OOP",我得到了错误 segment.cpp:90: error: incompatible types in assignment of 'const char [4]' to 'char [ 2000 年]'。我很混乱。之后我确实将匹配更改为字符串,然后在 .h 文件的段类中声明它,这就是我编译后得到的错误。
  • 尝试使用 C++ 风格的字符串,或者查看 sprintf cplusplus.com/reference/clibrary/cstdio/sprintf 的页面以及关于数组初始化的这个 SO 问题 stackoverflow.com/questions/201101/…
  • 谢谢!但是我确实将 (strstr(&word[i], data[i]) 更改为 (strstr(data[i], word)!=NULL,现在它通过了第 12 阶段...但我不知道为什么会这样工作。
【解决方案2】:

如果您将单词列表传递给函数:

使用 (strstr(&amp;word[i],data[i])) 表明您正在另一个字符串中寻找一个字符串。因此,您正在遍历字符串(单词)列表。

那么这看起来不对:

int segment::match(const char word[]) {

你在这里传递一个字。
它不可能告诉它应该是什么,但猜测是:

int segment::match(const char* word[]) {
                   //      ^^^^^

但老实说,整个事情都是相当丑陋的 C++。如果您正在编写 C,我会说很好,但是如果您正确地编写 C++,类型系统将使您免于所有这些问题。使用 std::string 来表示单词。

【讨论】:

  • 这似乎是一个作业,教授可能正在使用 C++ 来教授 OOP(我怎么猜的?),而不是关于 c/c++ 中 char 数组和字符串的最佳编程实践
  • @nrhine1:你不能声称教 OOP- 或 C++- 然后使用 const char*
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 2012-12-03
  • 2012-03-25
  • 2023-01-12
  • 2021-03-24
  • 1970-01-01
  • 2017-02-05
  • 2019-01-08
相关资源
最近更新 更多