c - C中每个空格分割字符串

标签 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 ++;
        }
    }
}
<小时/>

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

还有其他更优雅或更好的方法吗?

最佳答案

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

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

来自网站:

char * strtok ( char * str, const char * delimiters );

On a first call, the function expects a C string as argument for str, whose first character is used as the starting location to scan for tokens. In subsequent calls, the function expects a null pointer and uses the position right after the end of last token as the new starting location for scanning.

Once the terminating null character of str is found in a call to strtok, all subsequent calls to this function (with a null pointer as the first argument) return a null pointer.

Parameters

  • str
    • C string to truncate.
    • Notice that this string is modified by being broken into smaller strings (tokens). Alternativelly [sic], a null pointer may be specified, in which case the function continues scanning where a previous successful call to the function ended.
  • delimiters
    • C string containing the delimiter characters.
    • These may vary from one call to another.

Return Value

A pointer to the last token found in string. A null pointer is returned if there are no tokens left to retrieve.

Example

/* 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;
}

关于c - C中每个空格分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009025/

相关文章:

c - 从特定文件描述符读取输入

c++ - C++ 中是否存在 typename 关键字,以便向后兼容 “C templates?”

c - 在 C 中连接两个字符串的安全方法

命令行界面和过程控制

c - 如何查看内存带宽是否已经成为瓶颈?

c - 如何控制 apache c 模块中的连接

c - C中的固定精度

c - 两个多项式相加

iOS:@encode 并直接使用 -> 访问子类的属性

c - 在二叉树中插入节点时程序崩溃