c - 如何删除字符串中的相似词?
问题描述
我有程序从字符串中删除相似的单词,但这个程序只删除一次单词而不是重复的单词。
例如输入:
sabunkerasmaskera kera
并且应该输出:
sabunmas
这是我的代码:
#include <stdio.h>
#include <string.h>
void remove(char x[100], char y[100][100], char words[100]) {
int i = 0, j = 0, k = 0;
for (i = 0; x[i] != '\0'; i++) {
if (x[i] == ' ') {
y[k][j] = '\0';
k++;
j = 0;
} else {
y[k][j] = x[i];
j++;
}
}
y[k][j] = '\0';
j = 0;
for (i = 0; i < k + 1; i++) {
if (strcmp(y[i], kata) == 0) {
y[i][j] = '\0';
}
}
j = 0;
for (i = 0; i < k + 1; i++) {
if (y[i][j] == '\0')
continue;
else
printf("%s ", y[i]);
}
printf ("\n");
}
int main() {
char x[100], y[100][100], kata[100];
printf ("Enter word:\n");
gets(x);
printf("Enter word to remove:\n");
gets(words);
remove(x, y, words);
return 0;
}
我的程序输出它:
sabunkerasmaskerara
事实并非如此。也许我需要你的意见来修复这个程序,我也需要帮助让它变得更好。
解决方案
您的解决方案不起作用,因为它用于strcmp
比较字符串部分,这仅在子字符串位于字符串末尾时才有效,因为这使其以空值结尾。
您应该改为使用strstr
来定位匹配项并使用memmove
来移动字符串内容。
您的代码中还有其他问题:
- 不使用
gets()
y
对于此任务是不必要的。words
没有定义
这是修改后的版本:
#include <stdio.h>
#include <string.h>
char *remove_all(char *str, const char *word) {
size_t len = strlen(word);
if (len != 0) {
char *p = str;
while ((p = strstr(p, word)) != NULL) {
memmove(p, p + len, strlen(p + len) + 1);
}
}
return str;
}
int main() {
char str[100], word[100];
printf ("Enter string:\n");
if (!fgets(str, sizeof str, stdin))
return 1;
printf("Enter word to remove:\n");
if (!fgets(word, sizeof word, stdin))
return 1;
word[strcspn(word, "\n")] = '\0'; // strip the trailing newline if any
remove_all(str, word);
fputs(str, stdout);
return 0;
}
推荐阅读
- oracle - 如何使用掩码将字符转换为数字
- python - 我的下载功能以固定名称保存文件
- java - Testcontainers - 在实例化过程中不要自动启动容器
- javascript - 确定属性是来自父母还是孩子
- javascript - 数组包含存储在其他一些空值部分中的空值
- c# - LINQ中的group n by vs group n by into g有什么区别?
- ios - 可访问性无法在 ios 中更改文本视图的高度约束时正常工作
- swift - SwiftUI 中列表的多个过滤器/切换
- swift - 使用 NSAttributedString 在 UILabel 中的 HTML 文本(带表格)
- performance - 如何在 JMeter 中显示实际循环计数