gpt4 book ai didi

c - 如何使用自定义函数 split() 将句子拆分为单个单词?

转载 作者:行者123 更新时间:2023-11-30 20:17:01 25 4
gpt4 key购买 nike

我试图将用户的输入拆分为单独的单词,然后在换行符上打印每个单词。

我有一个函数 split(),它尝试使用 strtok() 方法来分割每个单词。当我尝试循环遍历 Main() 中的单词来打印它们时,它根本不打印。

编译后,出现两个错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 10
#define SIZE 256

char *read_line(char *buf, size_t sz) {
printf("> ");
fgets(buf, sz, stdin);
buf[strcspn(buf, "\n")] = 0;
return buf;
}

void split(char *buf, char *words[], size_t max) {
char *temp = strtok(buf, " ");

for (int i = 0; words[0] != '\0'; i++) {
strcpy(words[i], temp);
temp = strtok(NULL, buf);
}
}

int main(int argc, char **argv) {
char *buf = malloc(SIZE);
char *words = malloc(MAX * sizeof(char));

while(1) {
char *input = read_line(buf, SIZE);
split(input, words, MAX);

for (int i = 0; words[i] != '\0'; i++) {
printf("%s\n", words[i]);
}
}
}

有什么我正在做或没有正确理解的事情吗?

最佳答案

有很多问题:

这就是你想要的。评论解释了错误所在:

void split(char* buf, char* words[], size_t max) {
char* temp = strtok(buf, " ");

int i = 0;
while (temp != NULL) // wrong usage of strtok
{
words[i++] = strdup(temp); // words[i] points nowhere, you need to allocate memory
temp = strtok(NULL, " "); // wrong usage of strtok
}
words[i] = NULL; // you didn't terminate the words array
}

int main(int argc, char** argv) {
char* buf = malloc(SIZE); // this could be "char buf[SIZE];". It's not wrong
// but there's no need for dynamically allocating memory here

char** words = malloc(MAX * sizeof(char*)); // you need to allocate pointers to char, not char

while (1) {
char* input = read_line(buf, SIZE);
split(input, words, MAX);

for (int i = 0; words[i] != NULL; i++) { // you need to check for the NULL pointer
printf("%s\n", words[i]); // not the NUL char
}
}
}

还有改进的空间

  • split 函数不会检查 max
  • 在程序结束时,分配的内存没有正确释放
  • 为了简洁起见,没有进行任何错误检查

strdup可能在您的平台上不可用,因此您可能需要自己实现(基本上是 3 行代码)

关于c - 如何使用自定义函数 split() 将句子拆分为单个单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58955497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com