// ArrayTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include<assert.h>
//#include <stdio.h> //#include <stdlib.h>
//using std::cout;
//using std::endl;
//using std::string;
using namespace std;
/
/prototype
char *strcpy0(char *strDest, const char *strSrc) // 不会改变实参
{
char *address=strDest;
assert((strDest != NULL) && (strSrc != NULL));
//if((strDest == NULL) || (strSrc == NULL))
//{ return NULL; }
//while(*strSrc)                  // while(*strSrc != ’\0’)
//{
// *strDest++ = *strSrc++;  // "="
//}
/
/*strDest = '\0';                // 加上字符串结束标志, 否则输出abcDE
while(*strDest++ = *strSrc++) // 自動拷貝到字符串結束標誌
;
return address;    // 若return strDest;则cout<<"str"输出'\0'之后內容(空), 若return --strDest;则cout<<"str"输出'c'之后內容("c") 
}
//prototype:
int strcmp0(const char *str1,const char *str2) // 不会改变实参
{         
assert((str1 != NULL) && (str2 != NULL));
while(*str1 && *str2 && (*str1 == *str2)) // 此处判断str1 & str2任一不为'\0'即可; "=="
{
str1++;
str2++;
}
if (*str1 == *str2)
return 0;
else
return (*str1-*str2)>0?1:-1;
}
//prototype:
char *strcat0(char *strDest, const char *strSrc) //将源字符串加const表明其为输入参数
{
char* address = strDest;      //该语句若放在assert之后,编译出错
assert((strDest != NULL) && (strSrc != NULL)); //对源地址和目的地址加非0断言
while(*strDest)    //若使用while(*strDest++)则会出错
{                       
strDest++;
}
while(*strDest++ = *strSrc++) // while((*strDest++ = *strScr++)!=’\0’)的简化形式
{
NULL;
}        // 此处可以加语句*strDest=’\0’; 无必要
return address;    // 为了实现链式操作,将目的地址返回
}
size_t  __cdecl strlen1(const char * s)
{
int i;
for(i = 0; *s; i++, s++)
;
return i;
}
//prototype:
int strlen0(const char *str) // 不会改变实参
{
int len = 0;
assert(str != NULL);
while(*str++)
{
len++;
}
return len;
}
int _tmain(int argc, _TCHAR* argv[])
{
//test strcpy0
/
/char from[10] = "abc"; // 或char* pfrom = "abc";
//char to[15] = "ABCDE"; // 可以不是NULL,字符数组內容允许修改;
//      // char* pto = "ABCDE"; 进行strcpy0(pto, pfrom)报错,字符串常量只读,不可更改;
//      // char* pto = NULL; 輸出一個指向為空的字符指針時報錯;进行strcpy0(pto, pfrom)报错,指针无指向,沒有分配空间;
//char* str = NULL;
//cout<<"to: "<<to<<endl;
//cout<<"from: "<<from<<endl;
//str = strcpy0(to, from);// 只是将地址拷贝给形参,无论from是字符数组名还是字符指针
//cout<<"to: "<<to<<endl;
//cout<<"from: "<<from<<endl;
//cout<<"str: "<<str<<endl;
//test strcmp0
//char src1[10
] = "abc";
//char src2[15] = "aba";
//char src3[15] = "abe";
//char src4[15] = "abcdefghi";
//cout<<src1<<" vs "<<src1<<" : "<<strcmp0(src1, src1)<<endl; // 0
//cout<<src1<<" vs "<<src2<<" : "<<strcmp0(src1, src2)<<endl; // 1
//cout<<src1<<" vs "<<src3<<" : "<<strcmp0(src1, src3)<<endl; // -1
//cout<<src1<<" vs "<<src4<<" : "<<strcmp0(src1, src4)<<endl; // -1
//cout<<src4<<" vs "<<src1<<" : "<<strcmp0(src4, src1)<<endl; // 1
/
/test strcat0
//char* str = NULL;
//char from[10] = "12345";
//char to[15] = "to";
//cout<<"to: "<<to<<endl;
//cout<<"from: "<<from<<endl;
//str = strcat0(to, from);
//cout<<"to: "<<to<<endl;  // to12345 (有可能超出此字符数组范围)
//cout<<"from: "<<from<<endl;
//cout<<"str: "<<str<<endl;
//char to_s[5] = "to";
/
/strcat_s(to_s, 5, "_s"); // stract_s是VS2005及以后新增的具有更强"安全性"的CRT函数, 第二个参数表示目标缓冲区大小
//      // 对缓冲区溢出(非法内存访问)抛出异常
//cout<<"to_s: "<<to_s<<endl;
//*****************Test 0*****************//
// test cout address & char
//char* str = "abcdefg";
//str+=4;
//cout<<str<<' '<<*str; // efg e
//test strlen() && sizeof()
//cout<<strlen("abcd")<<endl; //4
//cout<<sizeof("abcd")<<endl; //5
//char s[10] = "abcd";
//cout<<strlen(s)<<endl;  //4
//cout<<sizeof(s)<<endl;  //10
//test ASCII
//cout<<int('\0')<<endl;  //0
//cout<<int('A')<<endl;  //65
strcmp比较数组//cout<<int('a')<<endl;  //97
//cout<<int('A'-'a')<<endl;
//test two compensate
//char c = 0xec;    //11101100
//unsigned char c1 = 0xec;  //11101100
/
/cout<<int(c)<<endl;    //-20(10010100)
//cout<<int(c1)<<endl;  //236(11101100) 
//*****************Test 1*****************//
/*const size_t array_size = 10;
int ia[array_size];
for(size_t ix = 0; ix != array_size; ++ix)
ia[ix] = ix;
cout<<"array ia contains following 10 members:"<<endl;
for(size_t iy = 0; iy != array_size; ++iy)
cout<<"The "<<iy+1<<"st member is "<<ia[iy]<<endl;*/
//*****************Test 2*****************//
/
*const size_t array_size = 7;
int ia1[] = {0, 1, 2, 3, 4, 5, 6 };
int ia2[array_size];
for(size_t ix = 0; ix != array_size; ++ix)
ia2[ix] = ia1[ix];
cout<<"Array ia2 contains following 7 members:"<<endl;
for(size_t iy = 0; iy != array_size; ++iy)
cout<<"The "<<iy+1<<"st member of array ia2[] is: "<<ia2[iy]<<endl;*/
//*****************Test 3*****************//
/*int i;
//const int ib; // const object must be initialized if not extern.
extern const int ic;
const int *pic;
//int *const cpi; // const object must be initialized if not extern.
//const int *const cpic; // const object must be initialized if not extern.*/
//*****************Test 4*****************//
/*string s1;
string s2(s1);
string s3("value");
string s4(5, 'ab');
cout<<"Input string s1: "<<endl;
cin>>s1;
cout<<"String s1: "<<s1<<endl;
cout<<"String s2: "<<s2<<endl;
cout<<"String s3: "<<s3<<endl;
cout<<"String s4: "<<s4<<endl;*/
//*****************Test 5*****************//
/*const char *cp1 = "A string example";
const char *cp2 = "A different string";
// C-style
char largeStr[16+1+18+1];
strcpy(largeStr, cp1);
cout<<"String largeStr is as follows: "<<largeStr<<endl;
strcat(largeStr, " ");
cout<<"String largeStr is as follows: "<<largeStr<<endl;
strcat(largeStr, cp2);
cout<<"String largeStr is as follows: "<<largeStr<<endl;
//C++ Standard Lib --string
string largeStr0 = cp1;
cout<<"String largeStr0 is as follows: "<<largeStr0<<endl;
largeStr0 += " ";
cout<<"String largeStr is0 as follows: "<<largeStr0<<endl;
largeStr0 += cp2;
cout<<"String largeStr is0 as follows: "<<largeStr0<<endl;*/
/
/*****************Test 6*****************//
/*const char *cp = "hello";
int cnt = 0;
//while (cp) { ++cnt; ++cp;} //disaster: count until adress ++cp reaches null.
while (*cp)  { ++cnt; ++cp;} //count until *cp++ reaches '\0'.
cout<<"Integer cnt's value is: "<<cnt<<endl;*/
//*****************Test 7*****************//
/*const char ca[] = {'h', 'e', 'l', 'l', 'o'}; //no '\0'.
const char *cp = ca;
int cnt = 0;
while(*cp) { //disaster: output until reaches the next '\0'.
cout<<*cp<<'\t'<<cnt<<endl;
++cp;
++cnt;
}*/
//*****************Test 8*****************//
//C-style character string VS C++ Standard Lib type --string.
/*const char *pc = "a very long literal string";
const size_t len = strlen(pc);
for(size_t ix = 0; ix != 1000000; ++ix) {
char *pc2 = new char[len +1];
strcpy(pc2, pc);
if(strcmp(pc2, pc))
;
delete [] pc2;
}*/
//string str("a very long literal string");
//for(int ix = 0; ix != 1000000; ++ix) {
// string str2 = str;
// if(str != str2)
//  ;
//}
//*****************Test 9*****************//
return 0;
}