所以我有一个奇怪的问题。 C中的双引号以我不理解的方式运行。
我的情况是我试图编写一个基本的操作系统,并且没有使用任何库。我刚刚实现了一个打印功能,该功能可以完美运行……如果我手动构建字符串。
我的印象是,在C中使用双引号只是编写了一个字符数组和一个空终止符。我喜欢这个解释,它很简单,很符合我对C的理解。因此,您可以了解到其他事情正在发生的想法将给我带来极大的困扰!
因此,举例说明:
unsigned char *str = "bleah"; //doesn't work
print_char(str[0], 2, 5, WHIT_BLK);//doesn't work
print_at(str, 3, 4); //doesn't work
但:
unsigned char* msg;
*msg = 'n';
*(msg + 1) = 'o';
*(msg + 2) = 'p';
*(msg + 3) = 'e';
*(msg + 4) = 0;
print_at(msg, 4, 4); //works, but string
//must be constructed
//manually
如果我做:
unsigned char* str;
*str = "BLAH DE BLAH BLAH";
print_at(str, 0, 0);
我得到了一个奇怪的结果,在该结果中打印了看似随机,毫无意义的符号。
我能想到的最明显的事情是,该功能是在我通常使用的头文件之一中实现的,如果是这种情况,我将需要自己构建这种功能。我不确定该怎么做。
编辑:
我的print_at函数:
void print_at(unsigned char* message, int row, int col){ //string must be manually created for some reason
if (col >= 0 && row >= 0){
int a = get_screen_offset(col, row);
set_cursor(a);
}
int i=0;
while (message[i] != '\0'){
print_char(message[i], -1, -1, WHIT_BLK);
i++;
}
}
这是print_char():
void print_char(char character, int row, int col, char attribute){
//pointer to start of video memory
unsigned char* vidmem = (unsigned char*) VID_ADDR;
//default color scheme
if (!attribute){
attribute = WHIT_BLK;
}
//memory offset
int offset;
// if row and col < 0, offset is cursor
if (col >= 0 && row >= 0){
offset = get_screen_offset(col, row);
}
else {
offset = get_cursor();
}
if (character == '\n'){
//new line
int rows = offset / (2 * MAX_COLS);
offset = get_screen_offset(79, rows);
}
else{
unsigned char* locale = vidmem + offset;
unsigned char* attr_locale = vidmem + offset + 1;
*locale = character;
*attr_locale = attribute;
}
offset += 2;
offset = handle_scrolling(offset);
set_cursor(offset);
}
我已经对print_char进行了广泛的测试,并且只要它收到了正确的输入,它就可以在我对其进行测试的所有情况下都能正常运行。
最佳答案
用于
unsigned char *str = "bleah";
遭受两个问题-
const
正确性和signed/unsigned
类型。用于
char const *str1 = "bleah 1";
unsigned char str2[] = "bleah 2";
适用于gcc 4.8.2。
关于c - C中的双引号不会产生字符串,而是将奇怪的字节放入内存中吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30294971/