<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>

            C語言面試實例操作

            時間:2025-11-15 06:10:42 C語言 我要投稿

            C語言面試實例操作

              引導語:面試程序員少不了考驗對語言操作的熟練性,以下是百分網小編分享給大家的C語言面試實例操作,歡迎閱讀!

            C語言面試實例操作

              實例:編寫一個函數,實現把C/C++程序代碼中的注釋去掉,并把結果返回。

              解析:

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

              一次讀取一行,分兩種情況,因為有兩種注釋:

              (1)在讀取到的一行中查找“/pic/pic/p>

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

              (3)進行步驟1、步驟2,直到程序結束。

              編程時要考慮的特殊情況如下:

              “”中的“/pic/*”

              ‘’中的“/pic/*”

              “/pic/*”的嵌套關系,比如:

              /pic/*

              /* /pic/……

              一、我們要明確,需要我們去掉注釋的代碼,是一段正確的C/C++代碼,編譯連接可以通過。

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

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

              四、轉義字符的處理,'\''注意代表一個單引號字符,第一個單引號與第三個單引號結合。"\""代表了一個雙引號字符串,注意此處有三個雙引號,第一個和第三個結合。

              /pic/p>

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

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

              輸入:指向C/C++程序代碼的指針,代碼的長度

              注意:①要考/pic/*,/pic/*的嵌套關系。

              如:/pic/*/pic/等

              ②要注意處理''," "中的字符,字符串,包括轉義字符。

              如:'\''注意代表一個單引號字符,第一個單引號與第三個單引號結合

              "/pic/p>

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

              /pic/p>

              #include

              #include

              #include

              #include

              #include

              void remove_comment(char *buf, size_t size)

              {

              char *p, *end, c;/pic/p>

              char *sq_start, *dq_start;/pic/p>

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

              size_t len;/pic/p>

              p = buf;

              end = p + size;

              sq_start = NULL;

              dq_start = NULL;

              lc_start = NULL;

              bc_start = NULL;

              while (p < end) /pic/p>

              {

              c = *p;

              switch (c)

              {

              case '\'': /* 單引號 */

              if (dq_start || lc_start || bc_start)

              {

              /*當遇到過雙引號、/pic/*的時候,忽略字符串與注釋中的單引號 */

              p++;

              continue;/pic/p>

              }

              if (sq_start == NULL) /pic/p>

              {

              sq_start = p++;/pic/p>

              }

              else /pic/p>

              {

              len = (p++) - sq_start;/pic/p>

              if (len == 2 && *(sq_start + 1) == '\\') /pic/p>

              {

              /* 忽略\后面的的單引號 */

              continue;

              }

              sq_start = NULL;

              }

              break;

              case '\"': /pic/p>

              if (sq_start || lc_start || bc_start)

              {

              /*當遇到過單引號、/pic/*的時候,忽略字符串與注釋中的雙引號 */

              p++;

              continue;

              }

              if (dq_start == NULL)/pic/p>

              {

              dq_start = p++;/pic/p>

              }

              else /pic/p>

              {

              if (*((p++) - 1) == '\\')/pic/p>

              {

              /pic/p>

              continue;

              }

              dq_start = NULL;

              }

              break;

              case '/': /* 斜桿 */

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

              /pic/pic/*的后面,忽略此處的單斜杠

              p++;

              continue;

              }

              c = *(p+1);/pic/p>

              if (c == '/') /pic/pic/p>

              {

              lc_start = p;

              p += 2;

              }

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

              {

              bc_start = p;

              p += 2;

              }

              else/pic/p>

              {

              p++;

              }

              break;

              case '*': /* 星號 */

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

              /pic/*(bc_start == NULL)就遇到*

              p++;

              continue;

              }

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

              {

              p++;

              continue;

              }

              /pic/的情況,此時就找到了一對/*____________*/

              p += 2;

              memset(bc_start, ' ', p - bc_start);/pic/*____________*/之間的內容

              bc_start = NULL;

              break;

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

              if (lc_start == NULL)/pic/p>

              {

              p++;

              continue;

              }

              c = *(p - 1);

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

              c == '\r'是因為在UNIX系統下文件結尾的換行只有\n,而windows系統下文件結尾的換行為\r\n */

              lc_start = NULL;

              break;

              default:

              p++;

              break;

              }

              }

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

              如果遇到雙斜杠,這個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語言面試實例操作】相關文章:

            C語言文件操作解析詳解及實例代碼11-10

            C語言中文件操作詳解及實例代碼01-29

            C語言程序實例11-30

            C語言數組實例解析02-21

            C語言親密數實例11-06

            C語言自守數實例09-25

            C語言switch語句實例01-23

            C語言for語句的用法實例11-30

            Go與C語言的操作02-15

            • 相關推薦

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院