【问题标题】:String tokenization terminates before reading the entire string字符串标记化在读取整个字符串之前终止
【发布时间】:2022-01-16 07:31:42
【问题描述】:

我一直在尝试用空格字符分割字符串。字符串的格式为a, b,我需要将其拆分为ab。我写的代码如下,但循环总是在打印最后一个字符之前终止。

void tokenize(char *str)
{
    int i = 0, k = 0;
    char *ch = malloc(1000);
    printf("%s\n", str);
    while(i < strlen(str))
    {
        if(str[i] == ' ')
        {
            k = 0;
            printf("%s", ch);
            ch = malloc(1000);
            i++;
        }
        else if(str[i] == ',')
            i++;
        else
        {
            ch[k++] = str[i++];
        }
    }
}

输出

q1, q2
q1   

从上面的输出可以明显看出,它在打印 q2 之前终止,非常感谢解决此问题的解决方案。

【问题讨论】:

  • 你需要在循环之后打印 ch (一个 \n 可能是个好主意)
  • 谢谢,但是为什么循环在打印之前就终止了?
  • 您在阅读空格时打印,刺痛不是以空格结尾,所以没有打印

标签: c string


【解决方案1】:

您需要在循环后打印,因为打印仅在读取空格时完成:

#define STRLEN 1024

void tokenize(const char *str)
{
    int i = 0, k = 0;
    free(ch);
    char *ch = malloc(STRLEN);
    printf("%s\n", str);
    while(i < strlen(str))
    {
        if(str[i] == ' ')
        {
            k = 0;
            printf("%s\n", ch);
            ch = malloc(STRLEN);
            i++;
        }
        else if(str[i] == ',')
            i++;
        else
        {
            ch[k++] = str[i++];
        }
    }
    printf("%s\n", ch);
    free(ch);
}

【讨论】:

  • 只是好奇如果我添加if(str[i] == ' ' || i == strlen(str) - 1) 解决问题?
  • 它的内存泄漏。在printf()之后免费ch
  • 更新完成,谢谢@H.S.
猜你喜欢
  • 2018-08-21
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多