【问题标题】:How to Tokenize String without using strtok()如何在不使用 strtok() 的情况下标记字符串
【发布时间】:2021-09-22 08:50:23
【问题描述】:

我正在尝试在不使用 strtok() 的情况下标记字符串。

当我运行字符串的字符时,它将在每一行中打印。

例如,当我跑步时:

printfTokens("Hello from other side!");

输出应该是:

Hello
from 
other
side!

由于我刚刚学习 C,我在如何实现这个程序上被困了好几个小时。到目前为止,我只知道基础知识并玩弄不(仍然没有学习任何callocmalloc 等)。

到目前为止,我有这段代码,但输出没有打印任何内容。

#include <stdio.h>
#include <string.h>

#define MAX_WORD 100

void printfTokens(char *inputString) {

    int i;

    /*int inputStringLength;

    for(i = 0; inputString[i] != '/0'; i++) {
        inputStringLength++;
    }*/

    while(inputString[i] != '\0') {
        char testing[MAX_WORD];
        while(inputString[i] != ' ') {
            testing[inputString[i]]++;
            i++;
        }
        printf("%s", testing);
        i++;
    }
}

int main() {

    printfTokens("TESTING ONE! TWO! THREE!");

    return 0;
}

【问题讨论】:

  • 想想testing[inputString[i]]++; 行的作用。是你想要的吗?
  • 我想将每个字符一个一个地添加,所以我想我需要更改为 testing[inputString[i]++]?还是有点混乱..
  • ++是做什么的? inputString[i] 有什么作用?测试[某事]有什么作用?
  • 我使用 ++ 来添加单词中的每个字符,而 inputString[i] 是字符串中的每个字符。我创建了测试字符数组来添加每个数组字符。
  • ++ 没有“在单词中添加字符”之类的操作。你知道 ++ 是做什么的吗?它有什么作用?

标签: c string tokenize


【解决方案1】:
  1. 你没有初始化变量i

  2. while(inputString[i] != '\0')可以写成while(inputString[i])

  3. testing[inputString[i]]++ 可以计算来自inputString 的给定字符的出现次数,但打印它没有意义。您可能想要执行以下操作:

    while(1) 
    {
     char testing[MAX_WORD], *t=testing;
     while(inputString[i]&&(inputString[i]!=' '))
         *t++=inputString[i++];
     if (t>testing) printf("%s", testing);
     if (!inputString[i]) break;
     i++;
    }
    
  4. 最好命名为MAX_WORD_LENGTH 而不是MAX_WORD

这些是您的代码中的一些问题。

【讨论】:

  • 感谢您的反馈!对于#3,请问我应该怎么做?
  • @Muzzlet 更新
  • 非常感谢您的更新!在这个函数中,那么打印语句应该是 printf("%s", *t);在while循环之外?
  • @Muzzlet 再次更新
【解决方案2】:

示例标记化函数。

size_t tokenize(const char *inputString, const char *delim, char **argv, size_t maxtokens) 
{
    size_t ntokens = 0;
    char *tokenized = strdup(inputString);
    if(tokenized)
    {
        argv[0] = tokenized;
        while(*tokenized)
        {
            if(strchr(delim, *tokenized))
            {
                *tokenized = 0;
                ntokens++;
                if(ntokens == maxtokens - 1) 
                {
                    break;
                }
                argv[ntokens] = tokenized + 1;
            }
            tokenized++;
        }
    }
    return ntokens + 1;
}

int main() 
{
    char *tokens[10];
    size_t ntokens = tokenize("TESTING ONE! TWO! THREE!", " ", tokens , 10);
    for(size_t i = 0; i < ntokens; i++)
    {
        printf("Token[%zu] = `%s`\n", i, tokens[i]);
    }
    free(tokens[0]);
    return 0;
}

https://godbolt.org/z/znv8PszG6

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多