C-区分字符和数字,然后进行相应处理

时间:2018-08-27 20:51:53

标签: c arrays

我正在编写一个程序,将用户输入转换为 ASCII值或二进制值。如果字符串包含字母, 每个字母都应转换为ASCII。数字字符串将 转换为整个字符串的二进制值。如果两个字母和 输入数字,每个字母都将转换为ASCII,并且数字可以/只能用字母分隔,例如,“ 32”将打印二进制值“ 00100000”,但“ 3a2”应转换为“ 00000011”,“ 97”,“ 00000010”。

当前编写程序的方式,数字字符串完美转换为二进制。但是,字母字符串在末尾添加一个十进制的“ 0”。输出将每个字母转换为其ASCII值,然后将“ 0”转换为二进制。我不确定这个“ 0”来自哪里。此外,字符串开头 并以数字结尾(例如“ 6j3”)将打印ASCII值j,然后打印二进制值“ 6”,完全跳过“ 3”并在“ 6”之前打印“ j”。我想按照用户输入的确切顺序打印每个ASCII /二进制值。

我将发布我的整个代码以进行任何必要的说明,但是我认为问题出在defineChars()函数中。我还希望使用char *字母和char *数字函数来有效地处理适当的数据并存储最终的num []和let []数组,但是我不确定如何做到这一点。

我是C的初学者,所以请原谅。更正以及任何进一步的优化,将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <string.h>

#define EIGHT_BITS 255
#define SIXTEEN_BITS 65535
#define THIRTY_TWO_BITS 4294967295UL
#define SIXTY_FOUR_BITS 18446744073709551615ULL

//   defined in case of booleans
typedef enum { false, true } bool;

//  GET # OF ELEMENTS IN STRING
size_t getSize(char* input) {
    size_t size;
    size = strlen(input);
    printf("Number of Characters..... %d", size);
     //printf("\n----------------------------------");

    return size;
}

//  DETERMINE NUMBER OF BITS TO OUTPUT
int getBitLength(unsigned long long d) {
    int l;

    if (d <= EIGHT_BITS) {
        l = 8;
    }
    else if (d > EIGHT_BITS && d <= SIXTEEN_BITS) {
        l = 16;
    }
    else if (d > SIXTEEN_BITS && d <= THIRTY_TWO_BITS) {
        l = 32;
    }
    else if (d > THIRTY_TWO_BITS && d <= SIXTY_FOUR_BITS) {
        l = 64;
    }

    printf("\nBits..................... %d", l);

    return l;
}

// CONVERT INPUT TO BINARY VALUE
void convertToBinary(char* input) {
    static int b[64];
    int i, j, length, r;
    unsigned long long decimal;
    char* pEnd;

    // converts input to ull
    decimal = strtoull(input, &pEnd, 0);
     printf("\n\n---------------- %I64u ------------------", decimal);
    printf("\nULL...................... %I64u", decimal);
    length = getBitLength(decimal);

    //  creates array
    for (i = 0; i < length; i++) {
        r = decimal % 2;
        decimal /= 2;
        b[i] = r;
    }

    //  reverses array for binary value
    printf("\nBinary Value............. ");
    for (j = length - 1; j >= 0; j--) {
        printf("%d", b[j]);
    }
}

char* numbers(char* input) {
     char* num = (char*) malloc(sizeof(char) * 25);

     return num;
}

char* letters(char* input) {
     char* let = (char*) malloc(sizeof(char) * 25);

     return let;
}

void determineChars(char* input) {
     int i;
     char* num = numbers(input);
     char* let = letters(input);
     size_t inputSize = getSize(input);

     //   FOR EACH CHARACTER IN INPUT
     for (i = 0; i < inputSize; i++) {
          if (isdigit(input[i])) {
               //   stores number values from input into separate array
               num[i] = input[i];
               printf("\nNumbers: %c", num[i]);
          }

          if (!isdigit(input[i])) {
               //   stores letter values from input into separate array
               let[i] = input[i];
               printf("\nLetters: %c", let[i]);
               //   prints separator line + ASCII value
               printf("\n\n---------------- %c ------------------", let[i]);
               printf("\nASCII Value of %c......... %d", let[i], let[i]);
               //   removes char from input array
               input[i] = ' ';
          }
     }
     //   char array must consist of digits only
     convertToBinary(num);
}

int main() {
    //  GET INPUT
    char input[50];
    scanf("%s", input);
    determineChars(input);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

  

我想按照用户输入的确切顺序打印每个ASCII /二进制值。

在这种情况下,您将不得不稍微重组代码。这是因为如果输入仅包含数字,则必须打印二进制,如果字符串包含两者,则必须为字符和数字。我尝试使用以下代码来执行此操作,对其进行了一些清理,删除了警告和内存泄漏。
看看这是否是您想要的:

id_list = [i for i in products['skus'] if i.get("id")]

for i in id_list:
   if i['availability'] == 'IsThere':
       print(i)

我还尝试了您在问题中提到的测试用例以及其他几个用例,它似乎运行良好。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <string.h>

#define EIGHT_BITS 255
#define SIXTEEN_BITS 65535
#define THIRTY_TWO_BITS 4294967295UL
#define SIXTY_FOUR_BITS 18446744073709551615ULL

//  GET # OF ELEMENTS IN STRING
size_t getSize(char* input) {
    size_t size;
    size = strlen(input);
    printf("Number of Characters..... %d\n", size);
     //printf("\n----------------------------------");

    return size;
}

//  DETERMINE NUMBER OF BITS TO OUTPUT
int getBitLength(unsigned long long d) {
    int l;

    if (d <= EIGHT_BITS) {
        l = 8;
    }
    else if (d > EIGHT_BITS && d <= SIXTEEN_BITS) {
        l = 16;
    }
    else if (d > SIXTEEN_BITS && d <= THIRTY_TWO_BITS) {
        l = 32;
    }
    else if (d > THIRTY_TWO_BITS && d <= SIXTY_FOUR_BITS) {
        l = 64;
    }

    printf("\nBits..................... %d", l);

    return l;
}

// CONVERT INPUT TO BINARY VALUE
void convertToBinary(char* input) {
    static int b[64];
    int i, j, length, r;
    unsigned long long decimal;
    char* pEnd;

    // converts input to ull
    decimal = strtoull(input, &pEnd, 0);
    printf("\n---------------- %I64u ------------------", decimal);
    printf("\nULL...................... %I64u", decimal);
    length = getBitLength(decimal);

    //  creates array
    for (i = 0; i < length; i++) {
        r = decimal % 2;
        decimal /= 2;
        b[i] = r;
    }

    //  reverses array for binary value
    printf("\nBinary Value............. ");
    for (j = length - 1; j >= 0; j--) {
        printf("%d", b[j]);
    }
    printf("\n");
}

void determineChars(char* input) {
     int i;  
     long ret;
     char* ptr;  
     char c;
     size_t inputSize = getSize(input);

    ret = strtol(input, &ptr, 10);

    if((ret == 0) || ((strlen(ptr) != 0) && (strlen(input) != strlen(ptr))))
    {
        for (i = 0; i < inputSize; i++) {
            if (isdigit(input[i])) {
               c = input[i];
               printf("\nNumber: %c", c);
               convertToBinary(&c);
            }
            if (!isdigit(input[i])) {
               //   stores letter values from input into separate array            
               printf("\nLetter: %c", input[i]);
               //   prints separator line + ASCII value
               printf("\n---------------- %c ------------------\n", input[i]);
               printf("ASCII Value of %c......... %d\n", input[i], input[i]);
               //   removes char from input array

            }
        }      
    }
    else
       convertToBinary(input);

}

int main() {
    //  GET INPUT
    char input[50];
    scanf("%s", input);
    determineChars(input);  
}