所以我有一个奇怪的问题。 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/

10-12 18:21