好的,所以我的代码目前分割出一个像这样的字符串:" hello world"成:
hello
world
但是当我在字符串之间或之后有多个空格时,我的代码就不会表现出来。它需要该空间并将其计为要分析的单词/数字。例如,如果我在hello和world之间放入两个空格,我的代码就会产生:
hello
(a space character)
world
该空格实际上被视为单词/标记。
int counter = 0;
int index = strcur->current_index;
char *string = strcur->myString;
char token_buffer = string[index];
while(strcur->current_index <= strcur->end_index)
{
counter = 0;
token_buffer = string[counter+index];
while(!is_delimiter(token_buffer) && (index+counter)<=strcur->end_index)//delimiters are: '\0','\n','\r',' '
{
counter++;
token_buffer = string[index+counter];
}
char *output_token = malloc(counter+1);
strncpy(output_token,string+index,counter);
printf("%s \n", output_token);
TKProcessing(output_token);
//update information
counter++;
strcur->current_index += counter;
index += counter;
}
我可以在循环中看到问题区域,但我对如何解决这个问题感到有些困惑。任何帮助都必须得到赞赏。
答案 0 :(得分:1)
从编码的角度来看,如果你想知道如何在没有库作为练习的情况下做到这一点,那么在你遇到第一个分隔符后,你的循环中断是什么。然后,当您循环到第二个分隔符时,您不会进入第二个while循环并再次打印一个新行。你可以把
//update information
while(is_delimiter(token_buffer) && (index+counter)<=strcur->end_index)
{
counter++;
token_buffer = string[index+counter];
}
答案 1 :(得分:0)
使用标准C库函数strtok()。
而不是重新开发这样一个标准功能。
以下是相关的related manual page。
在您的情况下可以使用以下内容:
#include <string.h>
char *token;
token = strtok (string, " \r\n");
// do something with your first token
while (token != NULL)
{
// do something with subsequents tokens
token = strtok (NULL, " \r\n");
}
正如您所看到的,每次使用相同参数对strtok的后续调用都会向您发送一个char * adressed to the next token。
如果您正在使用线程程序,则可以使用strtok_r()C函数。
首先调用它应该与strtok()相同,但后续调用是通过NULL作为第一个参数传递的。 :
#include <string.h>
char *token;
char *saveptr;
token = strtok_r(string, " \r\n", &saveptr)
// do something with your first token
while (token != NULL)
{
// do something with subsequents tokens
token = strtok_r(NULL, " \r\n", &saveptr)
}
答案 2 :(得分:0)
只需将流程令牌逻辑放入if(counter > 0){...}
,这样只有在存在真实令牌时才会发生malloc
。像这样
if(counter > 0){ // it means has a real word, not delimeters
char *output_token = malloc(counter+1);
strncpy(output_token,string+index,counter);
printf("%s \n", output_token);
TKProcessing(output_token);
}