• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            唐吉訶德

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(2)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            ~對初學(xué)者屬于深入理解吧,高手請勿在此浪費(fèi)寶貴時(shí)間~

            看到這樣一個(gè)改錯(cuò)題:
            char p[5]; 
            char* s="12345"
            strcpy(p,s);
               cout << p << endl;
            錯(cuò)誤之處是很顯然的,作為字符串字面值的"12345"會在結(jié)尾處自動(dòng)加上空字符null,從而長度是6,上面的strcpy是會越界的,從而是個(gè)越界錯(cuò)誤。
            問題是我以為這樣的程序編譯的時(shí)候會出錯(cuò)呢!但是我在vc上運(yùn)行時(shí)是可以輸出正確結(jié)果的,這讓我很是納悶!后來找到了strcpy的源代碼才知原因,strcpy函數(shù)是不進(jìn)行越界處理的. 又因?yàn)閟trcpy連null一起復(fù)制,從而p能輸出正確的結(jié)果"12345"
            /*The strcpy function copies strSource, including the terminating null character, to the location specified by strDestination. No overflow checking is performed when strings are copied or appended. The behavior of strcpy is undefined if the source and destination strings overlap.*/
            char * __cdecl strcpy(char * dst, const char * src) 

            char * cp = dst; 

            while*cp++ = *src++ ) 
            /* Copy src over dst */ 

            return( dst ); 
            }
             
            貌似strcpy雖然不進(jìn)行越界處理,仍然是個(gè)挺好的函數(shù)呢,但是注意了,下面的代碼就能暴露出strcpy 的缺點(diǎn)了.
            char p[5];
            char *= "12345678";
            strcpy(p,s);
            cout 
            << p <<endl; //輸出12345678,而不是我們所設(shè)想的12345
            為了不因不知s的長度而犯下錯(cuò)誤,推薦使用strncpy。但是是不是用了strncpy就萬無一失了呢?看下面的代碼:
            char p[5];
            char* s = "12345";
            strncpy(p,s,
            5);
            cout 
            << p <<endl; //12345*&^(后面表示亂碼)
            不是都限制個(gè)數(shù)了么?為什么后面又有亂碼?
            問題來自在上述情形strncpy是不會復(fù)制字符串s后面的null的,不是以null結(jié)束的p不會輸出正確結(jié)果的。
            仍然給出strncpy的源代碼:
            /*The strncpy function copies the initial count characters of strSource to strDest and returns strDest. If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string. If count is greater than the length of strSource, the destination string is padded with null characters up to length count. The behavior of strncpy is undefined if the source and destination strings overlap.*/
            char * __cdecl strncpy ( char * dest, const char * source, size_t count ) 

            char *start = dest; 

            while (count && (*dest++ = *source++)) /* copy string */ 
            count
            --

            if (count) /* pad out with zeroes */ 
            while (--count) 
            *dest++ = '\0'

            return(start); 
            }
             
            那strncpy這么不穩(wěn)定,為何用它?strncpy經(jīng)常用于修改一個(gè)長字符串中間的一部分(看出不復(fù)制null的原因了吧!),如果實(shí)在要用到上述的代碼上,就在代碼最后加上p[5] = '\0'; 吧!

            函數(shù)名: stpcpy
            功  能: 拷貝一個(gè)字符串到另一個(gè)
            用  法: char *stpcpy(char *destin, char *source);

            程序例:
            #include <stdio.h>
            #include <string.h>
            int main(void)
            {
               char string[10];
               char *str1 = "abcdefghi";
               stpcpy(string, str1);
               printf("%sn", string);
               return 0;
            }
             
             
             
            函數(shù)名: strcat
            功  能: 字符串拼接函數(shù)
            用  法: char *strcat(char *destin, char *source);
            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
               char destination[25];
               char *blank = " ", *c = "C++", *Borland = "Borland";
               strcpy(destination, Borland);
               strcat(destination, blank);
               strcat(destination, c);
               printf("%sn", destination);
               return 0;
            }
             
             
             
            函數(shù)名: strchr
            功  能: 在一個(gè)串中查找給定字符的第一個(gè)匹配之處
            用  法: char *strchr(char *str, char c);

            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
                char string[15];
                char *ptr, c = 'r';
                strcpy(string, "This is a string");
                ptr = strchr(string, c);
                if (ptr)
                   printf("The character %c is at position: %d\n", c, ptr-string);// 不明白 
                else
                   printf("The character was not foundn");
                return 0;
            }
             
             
             
            函數(shù)名: strcmp
            功  能: 串比較
            用  法: int strcmp(char *str1, char *str2);
            看Asic碼,str1>str2,返回值 > 0;兩串相等,返回0

            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
                char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";
                int ptr;
                ptr = strcmp(buf2, buf1);
                if (ptr > 0)
                   printf("buffer 2 is greater than buffer 1n");
                else
                   printf("buffer 2 is less than buffer 1n");
                ptr = strcmp(buf2, buf3);
                if (ptr > 0)
                   printf("buffer 2 is greater than buffer 3n");
                else
                   printf("buffer 2 is less than buffer 3n");
                return 0;
            }
             
             
             
            函數(shù)名: strncmpi
            功  能: 將一個(gè)串中的一部分與另一個(gè)串比較, 不管大小寫
            用  法: int strncmpi(char *str1, char *str2, unsigned maxlen);

            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
               char *buf1 = "BBB", *buf2 = "bbb";
               int ptr;
               ptr = strcmpi(buf2, buf1);
               if (ptr > 0)
                  printf("buffer 2 is greater than buffer 1n");
               if (ptr < 0)
                  printf("buffer 2 is less than buffer 1n");
               if (ptr == 0)
                  printf("buffer 2 equals buffer 1n");
               return 0;
            }
             
             
             
            函數(shù)名: strcpy
            功  能: 串拷貝
            用  法: char *strcpy(char *str1, char *str2);

            程序例:
            #include <stdio.h>
            #include <string.h>
            int main(void)
            {
                char string[10];
                char *str1 = "abcdefghi";
                strcpy(string, str1);
                printf("%sn", string);
                return 0;
            }
             
             
             
            函數(shù)名: strcspn
            功  能: 在串中查找第一個(gè)給定字符集內(nèi)容的段
            用  法: int strcspn(char *str1, char *str2);

            程序例:
            #include <stdio.h>
            #include <string.h>
            #include <alloc.h>
            int main(void)
            {
                char *string1 = "1234567890";
                char *string2 = "747DC8";
                int length;
                length = strcspn(string1, string2);
                printf("Character where strings intersect is at position %dn", length);
                return 0;
            }
             
             
             
            函數(shù)名: strdup
            功  能: 將串拷貝到新建的位置處
            用  法: char *strdup(char *str);

            程序例:
            #include <stdio.h>
            #include <string.h>
            #include <alloc.h>
            int main(void)
            {
                char *dup_str, *string = "abcde";
                dup_str = strdup(string);
                printf("%sn", dup_str);
                free(dup_str);
                return 0;
            }
             
             
             
            函數(shù)名: stricmp
            功  能: 以大小寫不敏感方式比較兩個(gè)串
            用  法: int stricmp(char *str1, char *str2);

            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
               char *buf1 = "BBB", *buf2 = "bbb";
               int ptr;
               ptr = stricmp(buf2, buf1);
               if (ptr > 0)
                  printf("buffer 2 is greater than buffer 1n");
               if (ptr < 0)
                  printf("buffer 2 is less than buffer 1n");
               if (ptr == 0)
                  printf("buffer 2 equals buffer 1n");
               return 0;
            }
             
             
            函數(shù)名: strerror
            功  能: 返回指向錯(cuò)誤信息字符串的指針
            用  法: char *strerror(int errnum);

            程序例:
            #include <stdio.h>
            #include <errno.h>
            int main(void)
            {
               char *buffer;
               buffer = strerror(errno);
               printf("Error: %sn", buffer);
               return 0;
            }
             
             
             
            函數(shù)名: strcmpi
            功  能: 將一個(gè)串與另一個(gè)比較, 不管大小寫
            用  法: int strcmpi(char *str1, char *str2);

            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
               char *buf1 = "BBB", *buf2 = "bbb";
               int ptr;
               ptr = strcmpi(buf2, buf1);
               if (ptr > 0)
                  printf("buffer 2 is greater than buffer 1n");
               if (ptr < 0)
                  printf("buffer 2 is less than buffer 1n");
               if (ptr == 0)
                  printf("buffer 2 equals buffer 1n");
               return 0;
            }
             
             
             
            函數(shù)名: strncmp
            功  能: 串比較
            用  法: int strncmp(char *str1, char *str2, int maxlen);

            程序例:
            #include <string.h>
            #include <stdio.h>
            int  main(void)
            {
               char *buf1 = "aaabbb", *buf2 = "bbbccc", *buf3 = "ccc";
               int ptr;
               ptr = strncmp(buf2,buf1,3);
               if (ptr > 0)
                  printf("buffer 2 is greater than buffer 1n");
               else
                  printf("buffer 2 is less than buffer 1n");
               ptr = strncmp(buf2,buf3,3);
               if (ptr > 0)
                  printf("buffer 2 is greater than buffer 3n");
               else
                  printf("buffer 2 is less than buffer 3n");
               return(0);
            }
             
             
            函數(shù)名: strncmpi
            功  能: 把串中的一部分與另一串中的一部分比較, 不管大小寫
            用  法: int strncmpi(char *str1, char *str2);

            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
               char *buf1 = "BBBccc", *buf2 = "bbbccc";
               int ptr;
               ptr = strncmpi(buf2,buf1,3);
               if (ptr > 0)
                  printf("buffer 2 is greater than buffer 1n");
               if (ptr < 0)
                  printf("buffer 2 is less than buffer 1n");
               if (ptr == 0)
                  printf("buffer 2 equals buffer 1n");
               return 0;
            }
             
             
            函數(shù)名: strncpy
            功  能: 串拷貝
            用  法: char *strncpy(char *destin, char *source, int maxlen);

            程序例:
            #include <stdio.h>
            #include <string.h>
            int main(void)
            {
               char string[10];
               char *str1 = "abcdefghi";
               strncpy(string, str1, 3);
               string[3] = '';
               printf("%sn", string);
               return 0;
            }
             
             
            函數(shù)名: strnicmp
            功  能: 不注重大小寫地比較兩個(gè)串
            用  法: int strnicmp(char *str1, char *str2, unsigned maxlen);

            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
               char *buf1 = "BBBccc", *buf2 = "bbbccc";
               int ptr;
               ptr = strnicmp(buf2, buf1, 3);
               if (ptr > 0)
                  printf("buffer 2 is greater than buffer 1n");
               if (ptr < 0)
                  printf("buffer 2 is less than buffer 1n");
               if (ptr == 0)
                  printf("buffer 2 equals buffer 1n");
               return 0;
            }
             
             
             
            函數(shù)名: strnset
            功  能: 將一個(gè)串中的所有字符都設(shè)為指定字符
            用  法: char *strnset(char *str, char ch, unsigned n);

            程序例:
            #include <stdio.h>
            #include <string.h>
            int main(void)
            {
               char *string = "abcdefghijklmnopqrstuvwxyz";
               char letter = 'x';
               printf("string before strnset: %sn", string);
               strnset(string, letter, 13);
               printf("string after  strnset: %sn", string);
               return 0;
            }
             
             
            函數(shù)名: strpbrk
            功  能: 在串中查找給定字符集中的字符
            用  法: char *strpbrk(char *str1, char *str2);

            程序例:
            #include <stdio.h>
            #include <string.h>
            int main(void)
            {
               char *string1 = "abcdefghijklmnopqrstuvwxyz";
               char *string2 = "onm";
               char *ptr;
               ptr = strpbrk(string1, string2);
               if (ptr)
                  printf("strpbrk found first character: %cn", *ptr);
               else
                  printf("strpbrk didn't find character in setn");
               return 0;
            }
             
             
             
            函數(shù)名: strrchr
            功  能: 在串中查找指定字符的最后一個(gè)出現(xiàn)
            用  法: char *strrchr(char *str, char c);

            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
               char string[15];
               char *ptr, c = 'r';
               strcpy(string, "This is a string");
               ptr = strrchr(string, c);
               if (ptr)
                  printf("The character %c is at position: %dn", c, ptr-string);
               else
                  printf("The character was not foundn");
               return 0;
            }
             
             
             
            函數(shù)名: strrev
            功  能: 串倒轉(zhuǎn)
            用  法: char *strrev(char *str);

            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
               char *forward = "string";
               printf("Before strrev(): %sn", forward);
               strrev(forward);
               printf("After strrev():  %sn", forward);
               return 0;
            }
             
            函數(shù)名: strset
            功  能: 將一個(gè)串中的所有字符都設(shè)為指定字符
            用  法: char *strset(char *str, char c);

            程序例:
            #include <stdio.h>
            #include <string.h>
            int main(void)
            {
               char string[10] = "123456789";
               char symbol = 'c';
               printf("Before strset(): %sn", string);
               strset(string, symbol);
               printf("After strset():  %sn", string);
               return 0;
            }
             
             
             
            函數(shù)名: strspn
            功  能: 在串中查找指定字符集的子集的第一次出現(xiàn)
            用  法: int strspn(char *str1, char *str2);

            程序例:
            #include <stdio.h>
            #include <string.h>
            #include <alloc.h>
            int main(void)
            {
               char *string1 = "1234567890";
               char *string2 = "123DC8";
               int length;
               length = strspn(string1, string2);
               printf("Character where strings differ is at position %dn", length);
               return 0;
            }
             
             
            函數(shù)名: strstr
            功  能: 在串中查找指定字符串的第一次出現(xiàn)
            用  法: char *strstr(char *str1, char *str2);

            程序例:
            #include <stdio.h>
            #include <string.h>
            int main(void)
            {
               char *str1 = "Borland International", *str2 = "nation", *ptr;
               ptr = strstr(str1, str2);
               printf("The substring is: %sn", ptr);
               return 0;
            }
             
             
            函數(shù)名: strtod
            功  能: 將字符串轉(zhuǎn)換為double型值
            用  法: double strtod(char *str, char **endptr);
            程序例:
            #include <stdio.h>
            #include <stdlib.h>
            int main(void)
            {
               char input[80], *endptr;
               double value;
               printf("Enter a floating point number:");
               gets(input);
               value = strtod(input, &endptr);
               printf("The string is %s the number is %lfn", input, value);
               return 0;
            }
             
             
             
            函數(shù)名: strtok
            功  能: 查找由在第二個(gè)串中指定的分界符分隔開的單詞
            用  法: char *strtok(char *str1, char *str2);

            程序例:
            #include <string.h>
            #include <stdio.h>
            int main(void)
            {
               char input[16] = "abc,d";
               char *p;
               /* strtok places a NULL terminator
               in front of the token, if found */
               p = strtok(input, ",");
               if (p)   printf("%sn", p);
               /* A second call to strtok using a NULL
               as the first parameter returns a pointer
               to the character following the token  */
               p = strtok(NULL, ",");
               if (p)   printf("%sn", p);
               return 0;
            }
             
             
             
            函數(shù)名: strtol
            功  能: 將串轉(zhuǎn)換為長整數(shù)
            用  法: long strtol(char *str, char **endptr, int base);

            程序例:
            #include <stdlib.h>
            #include <stdio.h>
            int main(void)
            {
               char *string = "87654321", *endptr;
               long lnumber;
               /* strtol converts string to long integer  */
               lnumber = strtol(string, &endptr, 10);
               printf("string = %s  long = %ldn", string, lnumber);
               return 0;
            }
             
            函數(shù)名: strupr
            功  能: 將串中的小寫字母轉(zhuǎn)換為大寫字母
            用  法: char *strupr(char *str);

            程序例:
            #include <stdio.h>
            #include <string.h>
            int main(void)
            {
               char *string = "abcdefghijklmnopqrstuvwxyz", *ptr;
               /* converts string to upper case characters */
               ptr = strupr(string);
               printf("%sn", ptr);
               return 0;
            }
             
             
             
            函數(shù)名: swab
            功  能: 交換字節(jié)
            用  法: void swab (char *from, char *to, int nbytes);

            程序例:
            #include <stdlib.h>
            #include <stdio.h>
            #include <string.h>
            char source[15] = "rFna koBlrna d";
            char target[15];
            int main(void)
            {
               swab(source, target, strlen(source));
               printf("This is target: %sn", target);
               return 0;
            }



            PS:isalpha()是字符函數(shù),不是字符串函數(shù),

            isalpha
             


              原型:extern int isalpha(int c);
             
              用法:#include <ctype.h>
             
              功能:判斷字符c是否為英文字母
             
              說明:當(dāng)c為英文字母a-z或A-Z時(shí),返回非零值,否則返回零
            。
             
              舉例:

                  // isalpha.c
                 
                  #include <syslib.h>
                  #include <ctype.h>
                  #include <stdio.h>

                  main()
                  {
                    int c;
                   
                    clrscr();        // clear screen
                    printf("Press a key");
                    for(;;)
                    {
                      c=getchar();
                      clrscr();
                      printf("%c: %s letter",c,isalpha(c)?"is":"not");
                    }
                    return 0; // just to avoid warnings by compiler
                  }

            posted on 2010-04-25 02:07 心羽 閱讀(431) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
            久久亚洲AV成人无码软件| 一级做a爱片久久毛片| 欧美精品丝袜久久久中文字幕 | 欧美日韩精品久久久免费观看| 久久亚洲精品无码播放| 久久久91人妻无码精品蜜桃HD| 精品熟女少妇aⅴ免费久久| 狠色狠色狠狠色综合久久| 久久99精品国产99久久| 国产精品毛片久久久久久久| 久久久久久久尹人综合网亚洲 | 久久婷婷国产综合精品| 久久99国产综合精品| 久久国产精品久久| 亚洲天堂久久精品| 亚洲精品成人网久久久久久| 久久99九九国产免费看小说| 性做久久久久久久久久久| 亚洲精品无码久久久久久| 久久久久99精品成人片试看| 777久久精品一区二区三区无码| 久久国产视屏| 三上悠亚久久精品| 久久久久亚洲?V成人无码| 亚洲中文字幕无码久久2017| 久久青青草原国产精品免费 | 99999久久久久久亚洲| 伊人久久综合热线大杳蕉下载| 久久久久久久综合日本| 久久久久亚洲AV成人片 | 精品久久人妻av中文字幕| 国产欧美一区二区久久| 久久天天躁狠狠躁夜夜2020老熟妇 | 一级女性全黄久久生活片免费| 9久久9久久精品| 亚洲中文字幕无码久久精品1| 国产精品亚洲综合专区片高清久久久| 久久久无码精品亚洲日韩京东传媒 | 国产精品久久久久久久久软件| 久久99精品久久久久婷婷| 亚洲午夜无码久久久久小说|