gpt4 book ai didi

c - 对字符串数组中的单词进行排序

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

我的程序设计为允许用户输入一个字符串,我的程序将输出每个字母和单词出现的次数。我的程序还按字母顺序对单词进行排序。

我的问题是:我将看到的单词(首先未排序)及其出现次数输出为表格,并且在我的表格中我不想重复。 已解决

例如,如果单词“to”出现两次,我只希望单词“to”在我的表中仅出现一次,并输出出现次数。

我该如何解决这个问题?另外,为什么我不能简单地设置 string[i] == delim 来应用于每个分隔符,而不是必须为每个分隔符手动分配它?

编辑:修复了我的输出错误。但是,如何为 string[i] 设置条件以等于代码中的任何分隔符,而不仅仅是空格键?例如,在我的输出中,如果我输入“you,you”,它将输出“you,you”而不仅仅是“you”。我该如何写它才能删除逗号并将“you, you”作为一个单词进行比较。

感谢任何帮助。我的代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const char delim[] = ", . - !*()&^%$#@<> ? []{}\\ / \"";
#define SIZE 1000

void occurrences(char s[], int count[]);
void lower(char s[]);


int main()

{

char string[SIZE], words[SIZE][SIZE], temp[SIZE];

int i = 0, j = 0, k = 0, n = 0, count;
int c = 0, cnt[26] = { 0 };

printf("Enter your input string:");
fgets(string, 256, stdin);
string[strlen(string) - 1] = '\0';
lower(string);
occurrences(string, cnt);
printf("Number of occurrences of each letter in the text: \n");
for (c = 0; c < 26; c++){
if (cnt[c] != 0){
printf("%c \t %d\n", c + 'a', cnt[c]);
}
}
/*extracting each and every string and copying to a different place */
while (string[i] != '\0')

{
if (string[i] == ' ')

{
words[j][k] = '\0';
k = 0;
j++;
}

else

{
words[j][k++] = string[i];
}
i++;
}

words[j][k] = '\0';
n = j;

printf("Unsorted Frequency:\n");
for (i = 0; i < n; i++)

{
strcpy(temp, words[i]);
for (j = i + 1; j <= n; j++)

{
if (strcmp(words[i], words[j]) == 0)

{
for (a = j; a <= n; a++)
strcpy(words[a], words[a + 1]);

n--;
}
} //inner for
}
i = 0;

/* find the frequency of each word */
while (i <= n) {
count = 1;
if (i != n) {
for (j = i + 1; j <= n; j++) {
if (strcmp(words[i], words[j]) == 0) {
count++;
}
}
}

/* count - indicates the frequecy of word[i] */
printf("%s\t%d\n", words[i], count);
/* skipping to the next word to process */

i = i + count;
}
printf("ALphabetical Order:\n");

for (i = 0; i < n; i++)

{
strcpy(temp, words[i]);
for (j = i + 1; j <= n; j++)

{
if (strcmp(words[i], words[j]) > 0)

{
strcpy(temp, words[j]);
strcpy(words[j], words[i]);
strcpy(words[i], temp);
}
}
}
i = 0;
while (i <= n) {
count = 1;
if (i != n) {
for (j = i + 1; j <= n; j++) {
if (strcmp(words[i], words[j]) == 0) {
count++;
}
}
}

printf("%s\n", words[i]);
i = i + count;
}
return 0;

}

void occurrences(char s[], int count[]){
int i = 0;
while (s[i] != '\0'){
if (s[i] >= 'a' && s[i] <= 'z')
count[s[i] - 'a']++;
i++;
}
}

void lower(char s[]){
int i = 0;
while (s[i] != '\0'){
if (s[i] >= 'A' && s[i] <= 'Z'){
s[i] = (s[i] - 'A') + 'a';
}
i++;
}
}

最佳答案

我有解决你问题的方法,它的名字叫Wall 。不,不是当您遇到似乎无法解决的问题时要撞头的类型,而是您希望编译器发出的警告:所有这些。

如果您编译 C 代码时不使用 -Wall那么你就可以犯人们告诉你的所有错误,这就是为什么 C 如此危险。但是一旦您启用警告,编译器就会告诉您有关它们的信息。

我有 4 个适合你的程序:

for (c; c< 26; c++) {第一个 c 不执行任何操作,可以写为 for (; c < 26; c++) {或者更好的是 for (c = 0; c <26; c++) {

words[i] == NULL “声明无效”。嗯,这可能不是你想做的。编译器告诉您该行没有执行任何操作。

“未使用的变量‘文本’。”这也很清楚:您已将文本定义为变量,但从未使用过它。也许您有意为之,或者也许这是您认为需要的变量。不管怎样,现在就可以了。

“控制到达非空函数的末尾”。在C中main通常定义为int main ,即main返回一个 int。标准做法是,如果程序成功完成,则返回 0;如果出现错误,则返回其他值。添加return 0;在 main 结束时将起作用。

关于c - 对字符串数组中的单词进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33225655/

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