-1
#include<stdio.h>
#define msize 4096
struct memory
{
int a[msize];
};

void read(struct memory *m)
{
int i;
for(i=0;i<sizeof(msize);i++)
 {
    scanf("%d",&m->a[i]);
 }
}

int main()
{
struct memory m;
m.a[0]=250; // temperature value of 25,0
m.a[4]=01; // heater status OFF
m.a[8]=240; // temperature value of 24,0
m.a[12]=00; // heater status ON
m.a[16]=220; // temperature value of 22,0
m.a[20]=00; // heater status ON
read(&m);
return 0;
}

我创建了一个特定内存大小的结构,并将一些值插入到数组中并从数组中读取这些值。我很难将此值转换为 ASCII。

4

3 回答 3

1

for(i=0;i<sizeof(msize);i++)中,它不会是i<4096,而是会与i您平台上的整数大小进行比较。在 32 位系统中,它将是。所以循环将在迭代4后退出。4

在你的函数中,&m->a[i]m->a[i]m一个指针。

PS你的程序逻辑有很大问题。你正在为数组元素分配一些值main(),但在函数read()中覆盖了相同的值。

至于将整数值从数组转换为 ASCII,它相当简单。您只需使用%c格式说明符并将数组元素传递为参数。但我必须指出,没有 450 个 ASCII 值可以打印。因为只有一个字符有一个字节,你可以用它管理的最大值是 256 个字符。

PS您要打印的许多 ASCII 字符是不可打印的。一个是其 ASCII 值等于0

于 2013-05-09T07:24:08.987 回答
0

如果您想以 ASCII 格式存储,我的建议是按字符输入。

像这样

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

#define msize 4096
struct memory {
    char a[msize];
};

/*
m.a[0]=250; // temperature value of 25,0
m.a[4]=01;  // heater status OFF
m.a[8]=240; // temperature value of 24,0
m.a[12]=00; // heater status ON
m.a[16]=220;// temperature value of 22,0
m.a[20]=00; // heater status ON
*/

int read(struct memory *m){
    char inputbuff[4+1];
    int i=0;

    memset(m->a, ' ', sizeof(m->a)/sizeof(m->a[0]));//initialize by space
    while(i<msize/(4+4)){
        printf("input temperature value e.g.25,0 : 250(and enter)\n");
        fgets(inputbuff, sizeof(inputbuff), stdin);
        strncpy(m->a + i*4, inputbuff, 3);
        //i+=1;
        printf("input heater status ON or OFF e.g.ON : 00 , OFF : 01(and enter)\n");
        fgets(inputbuff, sizeof(inputbuff), stdin);
        strncpy(m->a + (i+1)*4, inputbuff, 2);
        i += 1;
        printf("continue input? (y or n) : ");
        fgets(inputbuff, sizeof(inputbuff), stdin);
        if(*inputbuff=='n' || *inputbuff=='N'){
            break;
        }
    }
    return i;
}

int main(void){
    struct memory m;
    read(&m);
    {
        //check print
        m.a[msize-1]='\0';
        printf("%s\n", m.a);
    }

    return 0;
}

添加更多

#include <stdio.h>
#include <string.h>

#define msize 4098

int *storeInt(void *address){
    int *ip =(int*)address;
    *ip = 777;//ip[0]=777;ip[1]=888;...
    return ip;
}

char *storeChars(void *address){
    char *cp =(char*)address;
    strcpy(cp, "hello");
    return cp;
}

void dump(void *address, size_t length){
    unsigned char *cp = (unsigned char*)address;
    size_t i;
    for(i=0;i<length;++i){
        if(i % 16 == 0) printf("\n");
        printf("%02X ", *cp++);
    }
}

int main(void){
    static char memory[msize];//create a static memory of a particular size
    char *block1, *block2;

    block1 = &memory[0];
    block2 = &memory[1024*2];//split a virtual

    int *ip;
    ip=storeInt(block1);//store some values in the memory
    printf("%d\n", *ip);//read the values from the memory

    char *cp;
    cp=storeChars(block2);//set hello\0
    printf("%s\n", cp);//say hello

    char ascValue[12];
    int value = *ip;//777
    //convert "value of int" to Ascii
    sprintf(ascValue, "%d", value);
    //Display it
    printf("value is %s\n", ascValue);

    dump(block1, 8);
    dump(block2, 8);

    return 0;
}
于 2013-05-09T08:59:56.143 回答
0

如果您的 read() 函数打算从内存中读取并打印到终端,那么您应该使用 printf() 而不是 scanf()。printf() 将通过 %d 格式字符串将整数值转换为 ASCII。scanf() 从标准输入读取并存储到内存中。scanf() 通过 %d 格式字符串将 ASCII 转换为整数。

于 2013-05-09T12:42:46.310 回答