【问题标题】:Tokenise a String in C programming [closed]在 C 编程中标记字符串 [关闭]
【发布时间】:2015-10-14 12:56:40
【问题描述】:

我是 C 编程的新手,我知道还有其他关于如何将字符串拆分为单词的解释,但它们似乎都与我的程序不相似。我很难在我的程序中找到错误:

#include <stdio.h>
#include <stdlib.h> 

int tokenise(char str[], int start, char result[]) {
    if (str[start] == "/o") {
        return -1;
    } else {
        result = str[start];
    }
}


int main() {    
    const int MAX_STRING = 256;
    char buffer[MAX_STRING];
    fgets(buffer, MAX_STRING, stdin);
    char result[256];
    int start;
    start = tokenise(buffer, 0, result);

    while ( start != -1 ) {
        printf("%s\n", result);
        start = tokenise(buffer, start, result);
    }
}

【问题讨论】:

  • 您有实际问题吗?
  • 以后请使用适当的缩进;它会让你的生活更轻松,人们更有可能回答你的问题。这次我给你修好了。此外,此代码无法编译。
  • 是的,我的程序无法运行,我不知道为什么
  • "是的,我的程序无法运行" 你的程序应该做什么?请提供示例输入、预期输出和实际输出。
  • 我的程序应该在一行中读取,例如“hello world”,然后在单独的行中返回每个单词,例如:“hello”在一行,“world”在下一行。跨度>

标签: c


【解决方案1】:

在你的函数tokenise -

if(str[start] == "/o"){

你和"/o"比较的是什么?应该是'\0'

if(str[start] == '\0'){

而在else 中,您的函数在return 中没有任何作用,因此在这种情况下是UB。

您的函数没有任何循环或使用递归来迭代数组,因此,您的逻辑似乎没有实现任何接近。

【讨论】:

  • 这不是这段代码中最大的问题,不能使用 == 比较 charconst char* 或使用 = 分配它们。
  • @szczurcio 这就是重点。他应该与空字符进行比较。而且它没有任何意义,因为 OP 的逻辑被打破了。
  • 啊,是的,没注意到单引号,你是对的。
【解决方案2】:

你的代码有很多问题:

else {
    result = str[start];
}

没有返回值。那是未定义的行为。

str[start] == '\o'

这是不正确的,因为您想与 EOS 空终止字符进行比较 改为这样做:

str[start] == '\0'

最后,如果你想让你的分词函数写入result,你需要传递一个指向result的指针,而不是result的值。

ps:撇开语义错误不谈,你的函数并没有像你想要的那样做。研究循环及其实现。

【讨论】:

  • \0 不是 EOF,而是 EOS。
猜你喜欢
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多