如何在不使用 strtok() 的情况下标记字符串
How to Tokenize String without using strtok()
我试图在不使用 strtok()
的情况下标记字符串。
当我输入运行个字符的字符串时,它会在每一行打印。
例如,当我 运行:
printfTokens("Hello from other side!");
输出应该是:
Hello
from
other
side!
因为我刚刚学习 C,所以我在如何实现这个程序上纠结了好几个小时。到目前为止,我只知道基础知识,并没有玩过(还没有学到任何 calloc
、mallo
c 等)。
到目前为止我有这段代码,但输出没有打印任何东西。
#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] != '[=12=]') {
char testing[MAX_WORD];
while(inputString[i] != ' ') {
testing[inputString[i]]++;
i++;
}
printf("%s", testing);
i++;
}
}
int main() {
printfTokens("TESTING ONE! TWO! THREE!");
return 0;
}
你没有初始化变量i
。
while(inputString[i] != '[=12=]')
可以写成while(inputString[i])
.
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++;
}
最好命名为MAX_WORD_LENGTH
而不是MAX_WORD
。
这些是您的代码中的一些问题。
标记化函数示例。
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;
}
我试图在不使用 strtok()
的情况下标记字符串。
当我输入运行个字符的字符串时,它会在每一行打印。
例如,当我 运行:
printfTokens("Hello from other side!");
输出应该是:
Hello
from
other
side!
因为我刚刚学习 C,所以我在如何实现这个程序上纠结了好几个小时。到目前为止,我只知道基础知识,并没有玩过(还没有学到任何 calloc
、mallo
c 等)。
到目前为止我有这段代码,但输出没有打印任何东西。
#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] != '[=12=]') {
char testing[MAX_WORD];
while(inputString[i] != ' ') {
testing[inputString[i]]++;
i++;
}
printf("%s", testing);
i++;
}
}
int main() {
printfTokens("TESTING ONE! TWO! THREE!");
return 0;
}
你没有初始化变量
i
。while(inputString[i] != '[=12=]')
可以写成while(inputString[i])
.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++; }
最好命名为
MAX_WORD_LENGTH
而不是MAX_WORD
。
这些是您的代码中的一些问题。
标记化函数示例。
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;
}