亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語言 百分網(wǎng)手機(jī)站

C語言面試實(shí)例操作

時(shí)間:2020-11-11 13:48:11 C語言 我要投稿

C語言面試實(shí)例操作

  引導(dǎo)語:面試程序員少不了考驗(yàn)對(duì)語言操作的熟練性,以下是百分網(wǎng)小編分享給大家的C語言面試實(shí)例操作,歡迎閱讀!

C語言面試實(shí)例操作

  實(shí)例:編寫一個(gè)函數(shù),實(shí)現(xiàn)把C/C++程序代碼中的注釋去掉,并把結(jié)果返回。

  解析:

  解答本題的基本步驟如下:

  一次讀取一行,分兩種情況,因?yàn)橛袃煞N注釋:

  (1)在讀取到的一行中查找“//”,如果找到,則把“//”及其后的部分扔掉。

  (2)在讀取到的一行中查找“/*”,記錄位置pos1,然后再在這行中查找“*/”,如果找到,也記錄位置pos2,扔掉它們與其中的內(nèi)容;以pos2開始,繼續(xù)查找“/*”,如果在當(dāng)前行中沒有找到,則去掉當(dāng)前行中“/*”及其后的內(nèi)容,讀取新的一行,查找“*/”,如沒有查找,去掉讀取到的這一行,再讀一行,查找“*/”,如找到,記錄位置pos2,去掉這一行的0到pos2之間的字符。

  (3)進(jìn)行步驟1、步驟2,直到程序結(jié)束。

  編程時(shí)要考慮的特殊情況如下:

  “”中的“//”和“/*”

  ‘’中的“//”和“/*”

  “//”與“/*”的嵌套關(guān)系,比如:

  ///*

  /* //*/……

  一、我們要明確,需要我們?nèi)サ糇⑨尩拇a,是一段正確的C/C++代碼,編譯連接可以通過。

  二、首先,這個(gè)題目答案自帶的解析,跟附帶程序不太對(duì)照,兩種注釋之注釋(1)沒有什么問題,程序中也是按照這樣的思想處理的。但是仔細(xì)分析了程序之后,發(fā)現(xiàn),注釋(2)就寫的有點(diǎn)問題了:其實(shí)在處理/*……*/時(shí)候,并沒有嚴(yán)格的分行處理,而是讀取到的一行中查找/*,記錄位置pos1,然后繼續(xù)查找*/,找到之后,刪除它們之間的代碼(包括注釋符號(hào)本身)。

  三、特殊情況中,這一條:‘’中的“//”和“/*”讓人想不明白,單引號(hào)我們一般在里面放一個(gè)字符,也即是'a',不考慮放置兩個(gè)字符的情況,也就是不會(huì)出出現(xiàn)‘//’‘/*’,所以,我很費(fèi)解,題目中為什么來了這么一條需要注意的特殊情況:‘’中的“//”和“/*”(題目問題嗎???),即便出現(xiàn)單引號(hào)中‘//’‘/*’同樣可以處理,本程序同樣可以處理。

  四、轉(zhuǎn)義字符的處理,'\''注意代表一個(gè)單引號(hào)字符,第一個(gè)單引號(hào)與第三個(gè)單引號(hào)結(jié)合。"\""代表了一個(gè)雙引號(hào)字符串,注意此處有三個(gè)雙引號(hào),第一個(gè)和第三個(gè)結(jié)合。

  // 5_8_remove_comment.cpp : Defines the entry point for the console application.

  /********************************************************

  功能:去除C/C++代碼中的注釋

  輸入:指向C/C++程序代碼的指針,代碼的長(zhǎng)度

  注意:①要考//和/*,//和/*的嵌套關(guān)系。

  如://*、/*//*/等

  ②要注意處理''," "中的字符,字符串,包括轉(zhuǎn)義字符。

  如:'\''注意代表一個(gè)單引號(hào)字符,第一個(gè)單引號(hào)與第三個(gè)單引號(hào)結(jié)合

  "//****"引號(hào)內(nèi)的當(dāng)做字符串處理、"\""代表了一個(gè)雙引號(hào)字符串,注意此處有三個(gè)雙引號(hào),第一個(gè)和第三個(gè)結(jié)合

  *********************************************************/

  //#include "stdafx.h"

  #include

  #include

  #include

  #include

  #include

  void remove_comment(char *buf, size_t size)

  {

  char *p, *end, c;//p-動(dòng)態(tài)移動(dòng)的字符指針,end-指向文件末尾的字符指針,c-代表一個(gè)p指向的字符

  char *sq_start, *dq_start;//sq_start-單引號(hào)(single quotes)開始位置指針,dq_start-雙引號(hào)(double quotes)開始位置指針

  char *lc_start, *bc_start;//lc_start-//的開始位置指針,bc_start-/*的開始位置指針

  size_t len;//記錄某符號(hào)結(jié)束和開始的位置之差(長(zhǎng)度,偏移量)

  p = buf;

  end = p + size;

  sq_start = NULL;

  dq_start = NULL;

  lc_start = NULL;

  bc_start = NULL;

  while (p < end) //當(dāng)指針沒有到達(dá)文件末尾

  {

  c = *p;

  switch (c)

  {

  case '\'': /* 單引號(hào) */

  if (dq_start || lc_start || bc_start)

  {

  /*當(dāng)遇到過雙引號(hào)、//或/*的時(shí)候,忽略字符串與注釋中的單引號(hào) */

  p++;

  continue;//繼續(xù)下一個(gè),對(duì)while而言的

  }

  if (sq_start == NULL) //如果之前未遇到單引號(hào)

  {

  sq_start = p++;//sq_start指向單引號(hào)的開始位置(p),p指向下一個(gè)字符(p+1)

  }

  else //如果之前遇到過單引號(hào),sq_start已經(jīng)保存了單引號(hào)開始位置,p指向當(dāng)前單引號(hào)

  {

  len = (p++) - sq_start;//len = p-sq_start; p=p+1;兩個(gè)單引號(hào)之間字符長(zhǎng)度,'a':len=2

  if (len == 2 && *(sq_start + 1) == '\\') //處理'\''這種情況,'\\'表示一個(gè)反斜杠字符

  {

  /* 忽略\后面的的.單引號(hào) */

  continue;

  }

  sq_start = NULL;

  }

  break;

  case '\"': // 雙引號(hào)

  if (sq_start || lc_start || bc_start)

  {

  /*當(dāng)遇到過單引號(hào)、//或/*的時(shí)候,忽略字符串與注釋中的雙引號(hào) */

  p++;

  continue;

  }

  if (dq_start == NULL)//如果之前未遇到雙引號(hào)

  {

  dq_start = p++;//dq_start指向雙引號(hào)的開始位置(p),p指向下一個(gè)字符(p+1)

  }

  else //如果之前遇到過雙引號(hào)

  {

  if (*((p++) - 1) == '\\')//'\\'表示一個(gè)反斜杠字符

  {

  // 處理這種"\""代表了一個(gè)雙引號(hào)字符串,忽略\后面的的雙引號(hào)

  continue;

  }

  dq_start = NULL;

  }

  break;

  case '/': /* 斜桿 */

  if (sq_start || dq_start || lc_start || bc_start) {

  //如果是單引號(hào)、雙引號(hào)、斜杠//、/*的后面,忽略此處的單斜杠

  p++;

  continue;

  }

  c = *(p+1);//否則,C指向斜杠后的字符

  if (c == '/') //兩個(gè)//情況

  {

  lc_start = p;

  p += 2;

  }

  else if (c == '*') // /*的情況

  {

  bc_start = p;

  p += 2;

  }

  else//其他

  {

  p++;

  }

  break;

  case '*': /* 星號(hào) */

  if (sq_start || dq_start || lc_start || bc_start == NULL) {

  //如果是單引號(hào)、雙引號(hào)、斜杠、的后面,或者前面沒有出現(xiàn)/*(bc_start == NULL)就遇到*

  p++;

  continue;

  }

  if (*(p + 1) != '/')//*之后不是/,例如:**/,第一個(gè)*之后并不是/,那么就繼續(xù)尋找。

  {

  p++;

  continue;

  }

  //否則,就是*/的情況,此時(shí)就找到了一對(duì)/*____________*/

  p += 2;

  memset(bc_start, ' ', p - bc_start);//清除一對(duì)/*____________*/之間的內(nèi)容

  bc_start = NULL;

  break;

  case '\n': /*換行符,主要處理遇到雙斜杠時(shí),需要清除雙斜杠到\n的前面的字符*/

  if (lc_start == NULL)//如果還沒有遇到雙斜杠,那么忽略

  {

  p++;

  continue;

  }

  c = *(p - 1);

  memset(lc_start, ' ',((c == '\r') ? (p++ - 1) : (p++)) - lc_start);/*如果遇到過雙斜杠,清空雙斜杠本身和到\n前面的那個(gè)字符,p指向下一個(gè)字符,/r是回車符(光標(biāo)退回到最前面),這里要判斷

  c == '\r'是因?yàn)樵赨NIX系統(tǒng)下文件結(jié)尾的換行只有\(zhòng)n,而windows系統(tǒng)下文件結(jié)尾的換行為\r\n */

  lc_start = NULL;

  break;

  default:

  p++;

  break;

  }

  }

  /****************************************************

  如果遇到雙斜杠,這個(gè)if語句存在的意義在于萬一最后

  一行代碼是帶有雙斜杠但沒有給換行符\n的,也要清除掉。

  *****************************************************/

  if (lc_start)

  {

  memset(lc_start, ' ', p - lc_start);

  }

  }

  int main(int argc, char *argv[])

  {

  int fd, n;

  char buf[102400];

  fd = open("C:/Documents and Settings/Administrator/桌面/test.c",_O_RDONLY, 0); /*只讀打開*/

  if (fd == -1)

  {

  return -1;

  }

  n = read(fd, buf, sizeof(buf));

  if (n == -1 || n == 0)

  {

  close(fd);

  return -1;

  }

  remove_comment(buf, n);

  *(buf + n) = '\0';

  printf(buf);

  close(fd);

  return 0;

  }

【C語言面試實(shí)例操作】相關(guān)文章:

1.C語言文件操作解析詳解及實(shí)例代碼

2.C語言位操作是

3.C語言的底層操作

4.C語言文件操作函數(shù)

5.C語言冒泡排序算法實(shí)例

6.php語言redis隊(duì)列操作實(shí)例

8.C語言中實(shí)現(xiàn)KMP算法實(shí)例

9.C語言程序?qū)嵗仃囎儞Q