【发布时间】:2019-05-18 19:48:44
【问题描述】:
我在以下代码中尝试做的是对字符串进行标记并将每个标记存储在动态分配的结构中,但排除任何重复项。
这种代码可以正常工作,直到我输入一个包含两个相同单词的字符串。例如,字符串“this this”也会存储第二个单词,即使它是相同的。但是如果我输入“this this is”,它会删除第二个“this”,并完全忽略字符串的最后一个单词,这样如果字符串中有重复项,它就不会被删除。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define dim 70
typedef struct string {
char* token[25];
} string;
int main() {
string* New = malloc(dim*sizeof(string));
char* s;
char* buffer = NULL;
int i = 0, r = 0;
s = malloc(dim * sizeof(char));
fgets(s, dim, stdin);
printf("The string is: %s\n", s);
New->token[i] = malloc(dim*sizeof(char));
New->token[i] = strtok(s, " ");
++i;
while((buffer = strtok(NULL, " ")) && buffer != NULL){
printf("\nbuffer is: %s", buffer);
for(r = 0; r < i; ++r) {
if(strcmp(New->token[r], buffer) != 0 && r == i-1) {
New->token[i] = malloc(strlen(buffer)*sizeof(char)+1);
New->token[i] = buffer;
++i;
}
else if(New->token[r] == buffer) {
break;
}
}
}
printf("\n New string: ");
for(i = 0; New->token[i] != NULL; ++i) {
printf(" %s", New->token[i]);
}
return 0;
}
在我看来,这应该可以正常工作,但我真的很难找到我在这里做错了什么。如果您需要更多信息,请直接问我,对于任何最终缺乏清晰度(以及我的英语),我深表歉意。
【问题讨论】:
-
您是否尝试过在每一步打印
New->token数组,以查看其内容以及程序如何与之交互?strtok()在处理过程中修改标记化字符串,这肯定会干扰New->token[0]的for循环中的输出。 -
请对您显示的代码应用一些一致的缩进。
-
@xing 我在分隔符中添加了
\n,但没有任何变化。另外,我应该使用strcpy()函数更改New->token[i] = malloc(...和New->token[i] = strtok(s, " ");吗? -
sizeof(char) == 1- 总是。所以s = malloc(dim * sizeof(char));变成s = malloc(dim); -
我看到的步骤: 1)输入一个包含几个空格分隔的子字符串的字符串。 2) 将字符串解析为子字符串数组。 3) 不允许在子字符串的最终集合中出现重复。如果这是您需要做的,还有更简单的方法。您是否需要使用动态分配?是否需要使用结构体?
标签: c string duplicates tokenize strtok