字符串标记化在读取整个字符串之前终止

Posted

技术标签:

【中文标题】字符串标记化在读取整个字符串之前终止【英文标题】: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 可能是个好主意) 谢谢,但是为什么循环在打印之前就终止了? 您在阅读空格时打印,刺痛不是以空格结尾,所以没有打印 【参考方案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.

以上是关于字符串标记化在读取整个字符串之前终止的主要内容,如果未能解决你的问题,请参考以下文章

C ++:为啥读取时空格总是终止字符串?

在文件中查找单词

从 MemoryStream 获取子字符串而不将整个流转换为字符串

什么是空终止字符串?

在 BigQuery 中加载 JSON / JSON 在从位置开始的行中解析错误 ...:解析器在字符串结束之前终止

在 Scala 2.7 中读取文件的行,保留行终止符