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

标签 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;

所以首先,我被要求输入随机排列的某些字符,并按照最高优先级将它们打印出来。

运算符的优先级(从最高到最低)为“!” (逻辑非)、“%”(余数)、“&” (按位与)、“^”(按位异或)、、“|” (按位或)。

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

但是当我尝试检查数字是否排列正确时,结果却并非如此。

知道我的代码有什么问题吗? 或者有什么想法可以让我的代码更简单,而不必将字符转换为数字?

这是示例

示例输入

3
& ^ %
& ^ !
& ^ !

样本输出

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

最佳答案

评论中已经指出了一些问题。具体来说,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;
}

关于c - 将字符转为数字并在c中排列数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52800193/

相关文章:

objective-c - C作为主要类(class);或没有ObjC的 cocoa 应用

C函数指针转换为另一个函数指针

c - 不幸的是,我的程序不想用空终止符替换换行符

c - C语言中的位数据类型

输入时两个整数之间的逗号

创建一个程序来求解幂而不使用 pow() 而使用 While 循环 : PROBLEM WITH "UNDEFINED" ANSWRES

c - 在信号处理程序中访问长整数

c - 初始化字符串值 vector

c - 指向结构体的指针

c++ - 求介绍nmake & makefile结构