手动将C中的4位int(十进制)提取到字符串中

时间:2014-10-11 19:20:04

标签: c arrays string char int

我在这个编程任务中苦苦挣扎,我在这里的一个班级。我是一名电气工程专业的学生,​​所以我的编程绝非令人惊叹。我被告知写一个带有12位数的c程序,并将每个12位数的数字提取到一个char数组中。我做了快速数学运算并意识到我们可以获得的最大数字是0xFFF或十进制4095。我发现了一种算法,我认为它可以很好地工作,但出于某种原因,我的代码并没有按照我的想法行事。我将继续尝试对此进行故障排除,但是以我唯一的方式运行它是linux终端窗口,我没有一个很好的调试实用程序来完成该程序。任何帮助将不胜感激。请随意提出一些问题,我会尽力提出问题。我不是一个流利的程序员,所以记住这一点。此外,如果有人能解释整数除法对我来说会有所帮助。我假设像8/10这样的东西会返回0的结果,但我不知道它在我运行程序时是那样工作的。谢谢。

我不能使用这些功能,必须手动操作。

这是我到目前为止所做的。

尝试@解决方案:

//12 bit value into string of decimal chars
//EX: 129 -> a '1' a '2' and a '9'

void main (void) {

#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <stddef.h>
//Initialize an array with 5 spaces, each space
//holds one character (accounts for largest number 4095)
char OUT[5];
uint8_t length = sizeof(char);

//Isolating each int value happens here
//initialize i to act as a counter to loop through array
uint8_t i=2;
//Initialize an input value to test the code;
uint16_t IN=549;

while (IN/10 > 0)
 {
OUT[length-(i+1)] = '0' + (IN%10);
 IN=IN/10;
 if (IN <= 10)
      {
      if (IN = 10) 
           {
           OUT[length-(i+1)] ='1';
           //fixes infinite loop issue               
           IN=0;
           }
      else
           {
           OUT[length-(i+1)] ='0' + IN;
           //fixes infinite loop issue               
           IN=0;
           }

      }
 //Increment Counter to keep track of char array    
 i++;
 }
//add the new line at the end of the array of chars
OUT[length-1]='\n';
printf("String is -> %s", OUT);

}

几个笔记: 使用IN%10是算法的一部分,该算法以十进制形式隔离最右边的数字。我不得不添加一些&#34;软糖因素&#34;到我的计数器让阵列正确排列并在我的char数组的末尾占用\ n。我放在while循环中的条件语句是捕获一些边缘情况(主要是当IN变为10或更小时)。

3 个答案:

答案 0 :(得分:0)

看起来你向后弯腰处理你必须先打印最左边的角色这一事实。如果你只是先生成最右边的字符然后反转它,那么逻辑就会简单得多。

#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>

//12 bit value into string of decimal chars
//EX: 129 -> a '1' a '2' and a '9'
void main (void) {

    char OUT[5];
    memset(OUT, 0, 5);

    int i=0;
    int j;
    uint16_t IN=549;

    // Generate the string in reverse order.
    while (IN != 0)
    {
        OUT[i++] = '0' + (IN%10);
        IN/=10;
    }

    // Reverse the string
    for (j = 0; j < i/2; j++) {
        char temp = OUT[j];
        OUT[j] = OUT[i-1-j];
        OUT[i-1-j] = temp;
    }

    printf("String is -> %s\n", OUT);

}

答案 1 :(得分:0)

这一行是你的问题:

uint8_t length = sizeof(char);

sizeof函数返回括号之间的类型大小。在这种情况下,它返回1,因为char是1字节变量。然后,当您尝试访问数组的元素时,您会从length-(i+1)获得负数。

答案 2 :(得分:0)

以下是我使用更复杂方式的最终解决方案,以防万一有人好奇/偶然发现问题。

void main (void) {

#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <stddef.h>
//Initialize an array with 5 spaces, each space holds one character (accounts for largest number 4095)
char OUT[5];
OUT[0] = '0';
OUT[1] = '0';
OUT[2] = '0';
OUT[3] = '0';
OUT[4] = '0';
uint8_t length =5; //sizeof(char) was giving me an error and thus not used.;

//Isolating each int value happens here
//initialize i to act as a counter to loop through array
uint8_t i=2;
//Initialize an input value to test the code;
uint16_t IN=4012;
//Initialize variable for % operator value
uint16_t mod=0;
while (IN/10 > 0)
 {
 mod=IN%10;
 OUT[length-i] = '0' + mod;
 IN=IN/10;
 if (IN <= 10)
      {
      if (IN == 10) 
           {
           OUT[length-(i+2)] ='1';
           OUT[length-(i+1)] ='0';
           //fixes infinite loop issue               
           IN=0;
           }
      else
           {
           OUT[length-(i+1)] ='0' + IN;
           //fixes infinite loop issue               
           IN=0;
           }
      }
 //Increment Counter to keep track of char array    
 i++;
 }
//add the new line at the end of the array of chars
OUT[length-1]='\n';
printf("String is -> %s", OUT);
}