gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:46:41 25 4
gpt4 key购买 nike

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

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

我发布了我的整个代码以进行任何必要的澄清,但我相信问题出在 certainChars() 函数中。我还希望使用 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;
}

最佳答案

I would like to print each ASCII/binary value in the exact order of the user input.

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

#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);
}

我还尝试了您在问题中提到的测试用例以及其他一些测试用例,它似乎工作得很好。

32
Number of Characters..... 2

---------------- 32 ------------------
ULL...................... 32
Bits..................... 8
Binary Value............. 00100000

3a2
Number of Characters..... 3

Number: 3
---------------- 3 ------------------
ULL...................... 3
Bits..................... 8
Binary Value............. 00000011

Letter: a
---------------- a ------------------
ASCII Value of a......... 97

Number: 2
---------------- 2 ------------------
ULL...................... 2
Bits..................... 8
Binary Value............. 00000010

6j3
Number of Characters..... 3

Number: 6
---------------- 6 ------------------
ULL...................... 6
Bits..................... 8
Binary Value............. 00000110

Letter: j
---------------- j ------------------
ASCII Value of j......... 106

Number: 3
---------------- 3 ------------------
ULL...................... 3
Bits..................... 8
Binary Value............. 00000011

关于C - 区分字符和数字,然后进行相应处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52046803/

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