在数组中收集相同的单词,C

时间:2013-09-19 11:01:06

标签: c arrays sorting

如果我有一个看起来像这样的数组: 'A \ t2 \ nB \ t5 \ nC \ t6 \ nB \ t2 \ n'< - 字母和数字由数字后面的标签(\ t)和新行(\ n)分隔。

我需要收集相同的字母表,同时总结字母表后面的数字。如果打印输出应该如下所示: 'A \ T2 \ NB \ T7 \ NC \ T6'。

我想过使用strcmp函数,但输入数组可能会改变,所以我无法知道它中包含什么字母。

编辑:抱歉,我认为我的问题不明确。我的数组不仅是一个字符,而且它也可以是一系列字符+数字。例如:'THIS \ t25 \ nTHESE \ t67 \ nTHOSE \ t2 \ nTHESE \ t \ tt2 \ nTHOSE23 \ t55 \ n'

3 个答案:

答案 0 :(得分:2)

您可以将当前行的字母表读入char c,将数字读入int i并定义int alpha[26],并将所有条目初始化为0。然后你只需要:

alpha[c - 'A'] += i;

然后打印出alpha

中的所有非零条目

答案 1 :(得分:0)

您可以一次收集每个角色并使用开关生成所需的输出... 像...

getch(c);
switch(c)
{
  //case for alphabets

  //case for numbers
}   

答案 2 :(得分:0)

我认为你应该首先找到最小的字母(通过ASCII代码编号,例如A = 65),搜索此字母的输入字符串(可能使用strchr)和summ(在单独的变量中)所有相对于此字母的数字,在结束,在新字符串中写入字母和数字,然后继续下一个字母(B = 66)。 然后你将有新的字符串排序和汇总。

char *input;
char *output;
char *p, *cur;
int nums, num;
char min;
char temp[20];
//search for minimal letter
for(int i = 0; i < strlen(input); i++){
    if(input[i] > 65 && input[i] < 90)
        if(input[i] < min)
            min = input[i];
}
//parsing input string
for(int i = 0; i < strlen(input)/4; i++){
//strlen(input)/4 because each sequense at least 4 letters
    p = input;
    num = 0;
    nums = 0;
    while(cur = strchr(p, min)){
        sscanf(cur+2, "%d", &num);
        nums += num;
        p = cur+1;
    }
    //filling new string
    sprintf(temp, "%c\t%d\n", min, nums);
    strcat(output, temp);
    min++;
}