使用多个空格在C中断开字符串

时间:2015-06-29 10:01:56

标签: c loops whitespace

好的,所以我的代码目前分割出一个像这样的字符串:" 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;
}

我可以在循环中看到问题区域,但我对如何解决这个问题感到有些困惑。任何帮助都必须得到赞赏。

3 个答案:

答案 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);
}