複習了一下c/c++的成果

來源:互聯網
上載者:User

首先先祝賀一下自己找到了一個合適的英文名字“Ice Lee”, 很簡單就是li bin的意思!^_^!
接下來講講重點,最近有空就對以前學習的語言c/c++進行了一下複習,收穫不少!發現原來自己對c/c++還是掌握的不好!
我的第一個問題是:
以前在編程時不太注意類型的寬度,而這個問題就是發生在這裡,原來在32位機下面,unsigned int和unsigned long 的寬度都是4個位元組,而unsigned short是2個位元組,POINT結構是8個位元組(我想可能是x,y都是定義成了unsigned int的原因吧)。很顯然這是個低級錯誤,不過以後再在不同平台上編程時一定要先查清類型寬度。

第二個問題是:
在調試回放程式發現fread的意外結束,很顯然我的檔案並沒有讀到檔案尾,但是feof確返回了1。後來才發現原來是0x1a的問題。對於f*系列的函數來說有兩種模式,1.text模式,2.binary模式。在text下系統會認為0x1a是EOF標誌,那麼就會認為是到了檔案尾,這種情況是在window發現的,很有意思的是在msdn中說fopen預設的模式是binary, 但實際上是text模式。我在unix/linux系統中到每發現這樣的問題。所以最好在開啟檔案的時候指明模式,
text模式:  fopen(fp, "*t");
binary模式: fopen(fp, "*b");

第三個問題是:
在linux下,使用fopen(xxx, "a+");時居然是在檔案的尾部添加一個01 00的值然後再附加資料。這點在函數說明文檔中沒有說明,後來我在linux下測試時也沒發現這樣的問題,可能是在arm平台下會有這個問題。所以如果想在檔案尾部添加資料,最保險的方式是,
fp = fopen(xxx, "a+b");
fseek(fp, 0, SEEK_END);

剩下的問題比較零散不過大部分是語言方面的;
1.成員初始化列表必須在類的第一次調用函數時完成

2.對vector操作時要非常的小心,
typedef vector IntArray;
IntArray array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 2 );
array.push_back( 3 );
// 刪除array數組中所有的2
for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
{
    if( 2 == *itor ) array.erase( itor );
}
這裡的問題是array.end()會往前移,結果少刪除了一個2

3. 在對char的使用問題上, 如果是在操作unicode,就要用unsigned char來聲明。
   如果使用ascii碼,可以用char,如果用於描述位元組,最好是用unsigned char來描述。

4.記憶體拷貝的時候,千萬要注意記憶體覆蓋的問題。
void* mymemcpy( void *dest, const void *src, size_t count )
{
      char* pdest = static_cast<char*>( dest );
      const char* psrc = static_cast<const char*>( src );

      if( pdest>psrc && pdest<psrc+cout ) // 防止覆蓋
      {
           for( size_t i=count-1; i!=-1; --i )
           pdest[i] = psrc[i];
      }
      else
      {
          for( size_t i=0; i<count; ++i )
          pdest[i] = psrc[i];
      }

      return dest;
}

5.列印出當前源檔案的檔案名稱以及源檔案的當前行號
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系統預定義宏,這種宏並不是在某個檔案中定義的,而是由編譯器定義的。

6.不使用第三個變數來實現a,b交換
標準的做法是
a = a + b;
b = a - b;
a = a - b;
我個人認為還有一種方法來實現:

7. 合并兩個有序表
Node *MLink(Node *headA, Node *headB)
{
    Node *p = headA;
    Node *q = headB;
    Node *pre = p;

    if ( NULL == p && NULL != headB )
    {
        headA = headB;
        return headA;
    }

    while ( NULL != p && NULL != (q=headB) )
    {
        if ( p->data  > q->data )
        {
            headB = q->next;
            q->next   = p;
            pre->next = q;
            pre = q;
        }
        else
        {
            pre = p;
            p = p->next;
        }
    }

    if ( pre != p && NULL == p && NULL != headB )
    {
        pre->next = headB;
    }

    return headA;
}

 以上就是這階段編程時遇到的一些問題,我想大多數初級程式員或多或少會遇到點這樣的問題,所以以後編程要以品質而不是程式碼數來衡量自己。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.