微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

初学者问题:如何将char*转成字符串?

如何解决初学者问题:如何将char*转成字符串?

我有一个名为 kmain()函数,它只有 1 个变量:vidmem。这是一个 char* 类型变量(一个字符),但我希望它是一个字符串。
这是我目前的代码

kmain()
{
    char* vidmem=(char*)0xb8000;
    vidmem[0] = 'A';
    vidmem[1] = 0x04;
}

如前所述,这个变量只有一个字符:A。我怎样才能把它变成一个字符串,即 Hello,World!

解决方法

其他人向您解释了如何获取字符串,这是您的问题。但是,这不是您的问题。您使用 x86 并希望写入 0xB8000 处的文本缓冲区以在屏幕上显示文本。这是不正常的,因为 x86 上的大多数其他程序都在操作系统中运行。

为了得到你想要的东西,你必须每隔一个字节设置你想要的字符,每隔一个字节设置你想要的颜色。字符串不能解决您的问题。

意味着你需要这样的东西:

#define COLOR 0x04  //red text on black background
vidmem[0] = 'A';
vidmem[1] = COLOR;
vidmem[2] = 'B';
vidmem[3] = COLOR;
vidmem[4] = 'C';
vidmem[5] = COLOR;

当然,在 forwhile 循环中执行此操作而不是手动执行会更有意义,但我想解释一下您需要做什么才能打印一些文字。

索引位置

您可以直接访问屏幕上的各个位置。 vidmem 是一个 25 行的数组,每行是一个位置数组,每个位置有一个字节用于符号,一个字节用于颜色。您可以更改您的 vidmem 声明,以便一目了然地看到您访问的内容。

#define COLOR 0x04
void kmain(void)  //also,use a proper declaration,with return type.
{
    //vidmem is a pointer to an array with 50 elements of an array of 2 elements with type char
    //The array [50][2] is exaclty the same as an array of [100],but 
    //with [50][2] we tell the compiler how to access it. 
    //The memory pointed to by vidmem has a special hardware function,so it should be volatile.
    volatile char (*vidmem)[50][2]=(void*)0xb8000; 
    //                      ^----- 50 columns per line
    //                          ^-  2 bytes per character

    //     V---------------  Line
    //        V------------  Column
    //           V---------  Symbol (0) or color (1)
    vidmem[0][0][0] = 'A';   //symbol at position 0,0 is a 'A'
    vidmem[0][0][1] = COLOR; //Set color for position 0,0
    vidmem[0][1][0] = 'B';   //symbol at position 0,1 is a 'B'
    vidmem[0][1][1] = COLOR; //Set color for position 0,1
    //you can also directly access any other position
    vidmem[1][0][0] = 'C';   //symbol at position 1,0 (second line) is a 'C'
    vidmem[1][0][1] = COLOR; //Set color for position 1,0
}
,

C 中的字符串是以空字符结尾的字节序列。 char * 指向此序列的开头。正如我所说,这样的序列必须以 \0 符号结尾,即 NUL 符号。因此,如果您想扩展您的代码以使 vidmem 包含 Hello World,您可以执行以下操作:

char vidmem[64];     // stack memory allocation (64 bytes)
vidmem[0] = 'H';
vidmem[1] = 'e';
vidmem[2] = 'l';
...
vidmem[11] = 'l';
vidmem[12] = 'd';
vidmem[13] = '!';
vidmem[14] = '\0';   // very important

现在你可以

printf("%s",vidmem);

观察

Hello,world!
,

字符串是由空字符终止的连续字符序列,用于 C 标准库函数,根据 2018 C 标准第 7.1.1 条第 1 段。要生成包含字符 'A'0x04 的字符串,只需在它们后面放一个零字节即可。

也就是说,char* vidmem(char*)0xb8000; 不是正确的 C 语法。也许你的意思是char *vidmem = (char *) 0xb8000;。这是一个可能在特殊情况下(不同于通用多用户环境)使用的定义,用于定义指向内存中指定位置的指针。但是,名称 vidmem 表明这可能是视频内存。字符串在视频内存中是一种不寻常的东西。此代码可能没有按照您的意图执行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。