在C语言中迭代字符数组元素
该代码应该接受用户的输入并将其转换为二进制。将输入分组为整数数组以存储字符代码和/或相邻数字,然后将整数数组中的每个项转换为二进制。当用户键入“c357”时,“c”应转换为99,然后转换为二进制。然后,“357”也应该转换成二进制。在在C语言中迭代字符数组元素,c,binary,C,Binary,该代码应该接受用户的输入并将其转换为二进制。将输入分组为整数数组以存储字符代码和/或相邻数字,然后将整数数组中的每个项转换为二进制。当用户键入“c357”时,“c”应转换为99,然后转换为二进制。然后,“357”也应该转换成二进制。在main()函数中,strlen(convert)不能准确表示数组convert中的项数,因此只能迭代第一个数组项 #include <stdio.h> #include <stdlib.h> #include <ctype.h>
main()
函数中,strlen(convert)不能准确表示数组convert
中的项数,因此只能迭代第一个数组项
#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
// DETERMINE NUMBER OF BITS TO OUTPUT
int getBitLength(unsigned 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;
}
return l;
}
// CONVERT INPUT TO BINARY VALUE
char* convertToBinary(unsigned long int decimal) {
int l = getBitLength(decimal);
static char b[33];
char bin[33];
int i, j, k = 0, r;
b[33] = '\0';
bin[33] = '\0';
printf("Bits................ %ld\n", l);
// creates array
for (i = 0; i < l; i++) {
r = decimal % 2;
decimal /= 2;
b[i] = r;
}
// reverses array for binary value
for (j = l - 1; j >= 0; j--) {
bin[k] = b[j];
strncpy(&bin[k], &b[j], l);
snprintf(&bin[k], l, "%d", b[j]);
k++;
}
printf("Binary Value: %s\n", bin);
return bin;
}
unsigned long int* numbersToConvert(char* input) {
const int MAX_INPUT = 20;
int i, k = 0, z = 0;
char numbers[MAX_INPUT];
unsigned long int *toConvert = malloc(MAX_INPUT * sizeof(int));
numbers[MAX_INPUT] = '\0';
for (i = 0; i < strlen(input); i++) {
if (isdigit(input[i])) {
numbers[z] = input[i];
if (!isdigit(input[i + 1])) {
toConvert[k] = strtol(numbers, NULL, 10);
printf("----- %ld -----\n", toConvert[k]);
z = 0;
}
else {
z++;
}
}
else {
printf("----- %c -----\n", input[i]);
printf("Character Code: %d\n", input[i]);
toConvert[k] = (unsigned long int) input[i];
}
k++;
}
return toConvert;
}
int main(void) {
const int MAX_INPUT = 20;
int i, p;
char input[MAX_INPUT];
unsigned long int* convert;
printf("------- Input --------\n");
scanf("%s", input);
input[MAX_INPUT] = '\0';
// PRINT INPUT AND SIZE
printf("\nInput: %s\n", input);
convert = numbersToConvert(input);
convert[MAX_INPUT] = '\0';
printf("strlen: %ld\n", strlen(convert));
for (i = 0; i < strlen(convert); i++) {
printf("num array: %ld\n", convert[i]);
convertToBinary(convert[i]);
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义八个字节255
#定义十六位65535
#定义32位4294967295UL
//确定要输出的位数
int getBitLength(无符号长d){
int l;
如果(d八位和d十六位和d=0;j--){
bin[k]=b[j];
strncpy(&bin[k],&b[j],l);
snprintf(&bin[k],l,“%d”,b[j]);
k++;
}
printf(“二进制值:%s\n”,bin);
返回仓;
}
无符号长整型*numbersToConvert(字符*输入){
const int MAX_输入=20;
int i,k=0,z=0;
字符数[最大输入];
无符号长整型*toConvert=malloc(最大输入*sizeof(int));
数字[最大输入]='\0';
对于(i=0;i
我已尝试以null终止每个字符串,以防止未定义的行为。我不确定某些变量(如果有的话)是否是静态的。很难读取您的代码 这里您有一些工作(将数字转换为二进制):
bin[33]
的访问超出其大小。访问权限应为0到32。甚至对输入[MAX_input]进行越界访问是基于零的。char数组[n]
的有效索引为0
。您的问题不清楚,是否应将“c357”
转换为99357
或99
和357
作为单独的值?@DavidC.Rankin它们将转换为单独的值。为什么向我解释数组从0开始很重要?我肯定我犯过错误,但代码中的一个示例可能会使该信息更加相关。重要的是要解释数组从零开始,所以不要这样做:const int MAX_INPUT=20编码>然后字符数[最大输入]然后执行numbers[MAX_INPUT]='\0',调用未定义的行为
它试图将地址的值设置为超出可变长度数组末尾的一个数字
。
static char *reverse(char *str)
{
char *end = str + strlen(str) - 1;
char *saved = str;
int ch;
while(end > str)
{
ch = *end;
*end-- = *str;
*str++ = ch;
}
return saved;
}
char *tostr(char *buff, unsigned long long val)
{
if(buff)
{
char *cpos = buff;
while(val)
{
*cpos++ = (val & 1) + '0';
val >>= 1;
}
*cpos = 0;
reverse(buff);
}
return buff;
}
int main()
{
char buff[128];
printf("%s\n", tostr(buff, 128));
}