C-区分字符和数字,然后进行相应的处理
我正在编写一个程序,将用户输入转换为 ASCII值或二进制值。如果字符串包含字母, 每个字母都应转换为ASCII码。一串数字将 将转换为整个字符串的二进制值。如果信和 输入数字后,每个字母将转换为ASCII,数字只能用字母分隔,例如“32”将打印二进制值“00100000”,但“3a2”应转换为“00000011”、“97”、“00000010” 按照目前编写程序的方式,数字字符串可以完美地转换为二进制。但是,字符串的末尾会添加一个小数“0”。输出将每个字母转换为ASCII值,然后将“0”转换为二进制。我不确定这个“0”是从哪里来的。此外,字符串开始 以数字结尾(例如“6j3”)将打印ASCII值j,然后是二进制值“6”,完全跳过“3”,并在“6”之前打印“j”。我想按照用户输入的确切顺序打印每个ASCII/二进制值 我正在发布我的全部代码,以便进行必要的澄清,但我相信问题出在determineChars()函数中。我还希望使用char*letters和char*numbers函数来有效地处理适当的数据并存储最终的num[]和let[]数组,但我不确定如何做到这一点 我是C语言的初学者,请原谅我的混乱。如有任何更正以及进一步优化,将不胜感激C-区分字符和数字,然后进行相应的处理,c,arrays,C,Arrays,我正在编写一个程序,将用户输入转换为 ASCII值或二进制值。如果字符串包含字母, 每个字母都应转换为ASCII码。一串数字将 将转换为整个字符串的二进制值。如果信和 输入数字后,每个字母将转换为ASCII,数字只能用字母分隔,例如“32”将打印二进制值“00100000”,但“3a2”应转换为“00000011”、“97”、“00000010” 按照目前编写程序的方式,数字字符串可以完美地转换为二进制。但是,字符串的末尾会添加一个小数“0”。输出将每个字母转换为ASCII值,然后将“0”转换为
#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;
}
#包括
#包括
#包括
#包括
#包括
#定义八个字节255
#定义十六位65535
#定义32位4294967295UL
#定义64位18446744073709551615ULL
//定义为布尔型
typedef枚举{false,true}bool;
//获取字符串中元素的#
大小\u t获取大小(字符*输入){
大小;
大小=strlen(输入);
printf(“字符数….%d”,大小);
//printf(“\n---------------------------------------------------”);
返回大小;
}
//确定要输出的位数
int getBitLength(无符号长d){
int l;
如果(d八位和d十六位和d三十二位和d=0;j--){
printf(“%d”,b[j]);
}
}
字符*数字(字符*输入){
char*num=(char*)malloc(sizeof(char)*25);
返回num;
}
字符*字母(字符*输入){
char*let=(char*)malloc(sizeof(char)*25);
退租;
}
void determineChars(字符*输入){
int i;
char*num=数字(输入);
char*let=字母(输入);
size\u t inputSize=getSize(输入);
//对于输入中的每个字符
对于(i=0;i
我想按照用户输入的确切顺序打印每个ASCII/二进制值
在这种情况下,您必须稍微重新构造代码。这是因为如果输入仅包含数字,则必须打印二进制,如果字符串同时包含字符和数字,则必须打印字符和数字。我已尝试使用以下代码执行此操作,对其进行了一些清理,删除了警告和内存泄漏。看看这是否是您想要的:
#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);
}
建议。如果输入字符串长度超过25个字符,这将显示未定义的行为。您正在将
input
传递给numbers()
和letters()
。您可以使用strlen()
获取输入字符串的长度,然后使用该长度确定要分配的内存量。另外,由于您不需要将其包含在malloc()
的参数中。是的,determineChars()
函数似乎总是通过调用convertToBinary(num)
来完成,这将最终打印一个数字。如果输入没有以十进制数字结尾,那么看起来这个数字将是0。@JohnBollinger我试图仅在输入包含数字时调用convertToBinary(num),但我不想在for循环中包含函数调用,因为它将被称为n次,其中n=inputSize。当且仅当输入实际包含数字时,如何调用convertToBinary(num)?这是一个解析问题。您需要将输入字符串分成由数字组成的区域和由单个非数字组成的区域,并适当地处理遇到的每个区域。您不一定需要将这些区域的字符累积到数组中,但在任何情况下,似乎每次发现区域的结尾时都需要为相应的区域类型调用输出函数,无论是在不同区域的开头还是在输入的结尾。是的,这将在循环中。这就是问题所需要的。关于:char*num=(char*)malloc(sizeof(char)*25)
和类似语句:1)表达式:sizeof(char)
在C标准中定义为1。把任何东西乘以1绝对没有效果。建议将该表达式从参数中删除到malloc()
2)返回的类型是void*
,它可以
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