将字符转换为数字并在c中排列数字

时间:2018-10-14 06:47:04

标签: c

int T, i;
scanf("%d", &T);

char a[T], b[T], c[T];
int temp[T], temp2[T], temp3[T];
int point1[T], point2[T], point3[T];
for(i=0;i<T; i++){
    scanf("%c %c %c", &a[i], &b[i], &c[i]);
    switch(a[i]){
        case '!':
            point1[i] = 5;
            break;
        case '%':
            point1[i] = 4;
            break;
        case '&':
            point1[i] = 3;
            break;
        case '^':
            point1[i] = 2;
            break;
        case '|':
            point1[i] = 1;
            break;
        default :
            point1[i]=10;
    }
    switch(b[i]){
        case '!':
            point2[i] = 5;
            break;
        case '%':
            point2[i] = 4;
            break;
        case '&':
            point2[i] = 3;
            break;
        case '^':
            point2[i] =2;
            break;
        case '|':
            point2[i] =1;
            break;
        default :
        point2[i]=10;
    }
    switch(c[i]){
        case '!':
            point3[i] = 5;
            break;
        case '%':
            point3[i] = 4;
            break;
        case '&':
            point3[i] = 3;
            break;
        case '^':
            point3[i] =2;
            break;
        case '|':
            point3[i] =1;
            break;
        default :
        point3[i]=10;   
    }

    if(point1[i]<point2[i]) {
            temp[i]=point1[i];
            point1[i]=point2[i];
            point2[i]=temp[i];
    }

    if(point1[i]<point3[i]){
            temp2[i]=point1[i];
            point1[i]=point3[i];
            point3[i]=temp2[i];
    }

    if(point2[i]<point3[i]){
            temp3[i]=point2[i];
            point2[i]=point3[i];
            point3[i]=temp3[i];
    }

    printf("%d %d %d\n", point1[i], point2[i], point3[i]);
}

return 0;

因此,首先,我被要求输入随机排列的某些字符,并使其从最高优先级开始打印。

运算符的优先级(从最高到最低)是“!” (逻辑非),“%”(余数),“&” (按位AND),“ ^”(按位XOR),“ |” (按位或)。

因此,我尝试将字符更改为数字,并尝试首先排列数字,然后再次将数字更改为字符。

但是当我尝试检查数字是否正确排列时,不是。

任何想法我的代码有什么问题吗? 还是有任何使我的代码更简单而不必将字符转换为数字的想法?

这是示例

样本输入

3
& ^ %
& ^ !
& ^ !

样本输出

Case #1: % & ^
Case #2: ! & ^
Case #3: ! & ^

1 个答案:

答案 0 :(得分:1)

评论中已经提到了一些问题。具体来说,scanf将尾随换行符留在输入缓冲区中。您可以使用@ 4386427的建议来解决此问题。

您可以避免为每个字符手动分配数字,只需注意它们的ASCII已经按要求的顺序。那是, '!' <'%'<'&'<'^'<'|'。因此,您可以简单地将它们读入适当大小的char数组中,并在打印char数组之前按升序对其进行排序。这将大大缩短和清理您的代码。

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

int cmpfunc (const void * a, const void * b) {
   return (*((char*)a) > *((char*)b)) - (*((char*)a) < *((char*)b));
}

int main(int argc, char *argv[])
{
    int T, i, j;
    scanf(" %d", &T);

    /* TODO: Check if number of chars per line is T or 3. */
    char *a = malloc(T * sizeof(char));        
    for(i = 0; i < T; i++) {            
        for (j = 0; j < T; j++) {
            scanf(" %c", &a[j]);
        }

        printf("Before sort\n");
        for (j = 0; j < T; j++) {
            printf("%c ", a[j]);
        }
        printf("\n");

        qsort(a, T, sizeof(a[0]), cmpfunc);

        printf("After sort\n");
        for (j = 0; j < T; j++) {
            printf("%c ", a[j]);
        }
        printf("\n");
    }

    free(a);    
    return 0;
}