C中每个空格分割字符串

red*_*lja 54 c

我想在C中编写一个程序,在一个单独的行中显示整个句子的每个单词(作为输入).这是我到目前为止所做的:


void manipulate(char *buffer);
int get_words(char *buffer);

int main(){
    char buff[100];

    printf("sizeof %d\nstrlen %d\n", sizeof(buff), strlen(buff));   // Debugging reasons

    bzero(buff, sizeof(buff));

    printf("Give me the text:\n");
    fgets(buff, sizeof(buff), stdin);

    manipulate(buff);
    return 0;
}

int get_words(char *buffer){                                        // Function that gets the word count, by counting the spaces.
    int count;
    int wordcount = 0;
    char ch;

    for (count = 0; count < strlen(buffer); count ++){
        ch = buffer[count];
        if((isblank(ch)) || (buffer[count] == '\0')){                   // if the character is blank, or null byte add 1 to the wordcounter
            wordcount += 1;
        }
    }
    printf("%d\n\n", wordcount);
    return wordcount;
}

void manipulate(char *buffer){
    int words = get_words(buffer);
    char *newbuff[words];
    char *ptr;
    int count = 0;
    int count2 = 0;
    char ch = '\n';

    ptr = buffer;
    bzero(newbuff, sizeof(newbuff));

    for (count = 0; count < 100; count ++){
        ch = buffer[count];
        if (isblank(ch) || buffer[count] == '\0'){
            buffer[count] = '\0';
            if((newbuff[count2] = (char *)malloc(strlen(buffer))) == NULL) {
                printf("MALLOC ERROR!\n");
                exit(-1);
            }
            strcpy(newbuff[count2], ptr);
            printf("\n%s\n",newbuff[count2]);
            ptr = &buffer[count + 1];
            count2 ++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然输出是我想要的,但是在显示最后一个单词后我有很多黑色空格,而malloc()返回NULL,因此MALLOC错误!显示在最后.我可以理解我的malloc()实现有一个错误,但我不知道它是什么.

还有另一种更优雅的 - 通常更好的方法吗?

提前致谢.

Hor*_*ein 84

http://www.cplusplus.com/reference/clibrary/cstring/strtok/

看看这个,并使用空格字符作为分隔符.如果您需要更多提示,请告诉我.

来自网站:

char * strtok ( char * str, const char * delimiters );
Run Code Online (Sandbox Code Playgroud)

在第一次调用时,函数需要一个C字符串作为str的参数,其第一个字符用作扫描标记的起始位置.在后续调用中,函数需要一个空指针,并在最后一个标记结束后立即使用该位置作为扫描的新起始位置.

一旦在strtok的调用中找到str的终止空字符,对该函数的所有后续调用(使用空指针作为第一个参数)将返回空指针.

参数

  • 海峡
    • C字符串要截断.
    • 请注意,此字符串通过分解为较小的字符串(标记)进行修改.替代地[sic],可以指定空指针,在这种情况下,该函数继续扫描先前成功调用函数的位置.
  • 分隔符
    • 包含分隔符字符的C字符串.
    • 这些可能因呼叫而异.

回报价值

指向字符串中找到的最后一个标记的指针.如果没有要检索的标记,则返回空指针.

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意`strtok()`直接操作其输入`str`.如果您不想更改其值,请在调用`strtok()`之前将其复制到另一个c-string. (6认同)