// strcpy用法:// 1. 若源長<目標長 --->OK。 // 將源串COPY至目標串(包括結尾符),其它位元組保持不變,// 2. 若源長>目標長 --->溢出報錯。 // 將源串COPY至目標串(包括結尾符),但目標串太短,下標越界而溢出,不正常的字串顯然會在導致運行時異常// 使用原則總結:使用時保證源長<目標長!!void test_strcpy(){char strSource[] = "Sample string";char strDestShort[10];char strDestLong[40];int iSource = sizeof(strSource);int iDestShort = sizeof(strDestShort);int iDestLong = sizeof(strDestLong);// 情況1if (iSource < iDestLong)strcpy(strDestLong, strSource);std::cout << strDestLong << std::endl;// 情況2if (iSource > iDestShort){// strcpy(strDestShort, strSource); 這個樣子會報異常// 用最傳統的方法處理, 當然更好方法用標準庫的函數size_t l = sizeof(strDestShort);for (size_t i(0); i < l - 1; ++i)strDestShort[i] = strSource[i];strDestShort[l - 1] = 0; }std::cout << strDestShort << std::endl;}// strcpy_s用法:// 若源長<目標長 sizeof([min, max])--->OK,但自訂拷貝的字串長度超過目標長度時,會因下標越界而導致運行異常// 若源長>目標長 sizeof任何一方都會發生運行異常,// (有可能是編譯器在copy前會先檢查兩者長度,如果源串較長便會發生警示而退出,因此後續使用sizeof(strlen(strDest)=0)語句已無效)// 使用原則總結:// 1.使用時保證:源長<目標長// 2.長度不能超出szDest長度,建議使用sizeof(szDest)void test_strcpy_s(){char strSource[] = "Sample string";char strDestShort[10];char strDestLong[40];int iSource = sizeof(strSource);int iDestShort = sizeof(strDestShort);int iDestLong = sizeof(strDestLong);// 情況1if (iSource < iDestLong)strcpy_s(strDestLong, iDestLong, strSource);std::cout << strDestLong << std::endl;// 情況2if (iSource > iDestShort)strcpy_s(strDestShort, iDestShort, strSource); // 這個樣子會報異常std::cout << strDestShort << std::endl;}