亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2826 | 回復(fù): 8
打印 上一主題 下一主題

[C] 字符串放在堆內(nèi)存中,會(huì)不會(huì)有啥比較壞的影響? [復(fù)制鏈接]

論壇徽章:
6
CU大;照
日期:2013-05-20 10:43:41IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-29 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-27 06:20:00CU大;照
日期:2013-05-20 10:44:16CU大;照
日期:2013-05-20 10:44:0615-16賽季CBA聯(lián)賽之廣東
日期:2018-03-09 11:17:08
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2014-10-26 10:12 |只看該作者 |倒序?yàn)g覽
本帖最后由 craaazy123 于 2014-10-27 14:29 編輯

rt,先貼一下代碼,以下是to_lower_case1函數(shù),主要是將字符串轉(zhuǎn)換為小寫:

char *to_lower_case1(const char *src) {
        if(is_empty(src)) return "";
         
        // 申請(qǐng)堆內(nèi)存
        char *dst = (char *)calloc(strlen(src), sizeof(char *));
        
        // 將原來的拷貝一份
        strcpy(dst, src);
        char *p = dst;
        
       // 遍歷轉(zhuǎn)小寫
        for(; *p != '\0'; p++) {
                if(*p >= 'A' && *p <= 'Z') {
                        *p += 32;
                }
        }
      
        return dst;
}

這樣調(diào)用是比較方便的了,(方式一):
printf("%s\n", to_lower_case1("This is a String."));

較之前的(方式二):
char *src = "This Is A String.";
int len = strlen(src);
char dst[len];
printf("%s\n", to_upper_case(dst, src));

注意to_upper_case函數(shù)未貼出,其實(shí)和to_lower_case1差不多是一樣的。


我比較疑惑的是to_lower_case1返回的指針是需要自己手動(dòng)釋放的,但是如果按照方式一調(diào)用,內(nèi)存會(huì)不會(huì)釋放掉?

貼兩個(gè)文件,有問題的話,麻煩大家提出來,我是來學(xué)習(xí)的,謝謝:
string_util.h
  1. #ifndef __STRING_UTIL__
  2. #define __STRING_UTIL__

  3. typedef int bool;

  4. //char **split(const char* src, const char *delim);

  5. int first_index_of(const char *src, const char *chs);
  6. int last_index_of(const char *src, const char *chs);
  7. bool is_empty(const char *s);

  8. //char *to_lower_case(char *dst, const char *src);
  9. char *to_lower_case(const char *src);
  10. char *to_upper_case(const char *src);
  11. //char *to_upper_case(char *dst, const char *src);
  12. char *trim(const char *src);
  13. char *ltrim(const char *src);
  14. char *rtrim(const char *src);

  15. char *substr(const char *src, int start, int len);
  16. void destroy(char *s);

  17. #define char_at(str, i) (strlen(str) > i) ? *(str + i) : -1


  18. #endif
復(fù)制代碼
string_util.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define TRUE 1
  5. #define FALSE 0

  6. #include "string_util.h"

  7. int main(int argc, char** argv) {
  8.            //split("This is a string", " ");

  9.     //printf("%d\n", first_index_of("This is a string.", ""));
  10.         //printf("%d\n", is_empty(""));
  11.         /*char *src = "This Is A String.";
  12.         int len = strlen(src);
  13.         char dst[len];
  14.         printf("%s\n", to_upper_case(dst, src));*/

  15.         char *s = to_lower_case("This is a String.");
  16.         printf("%s\n", s);
  17.         destroy(s);

  18. /*        char *s = substr("This is a string.", 5, -1);
  19.         int l = strlen(s);
  20.         printf("s = %s, len = %d\n", s, l);
  21.         destroy(s);*/

  22. /*        char *s = ltrim("  \t \r \n");
  23.         int l = strlen(s);
  24.         printf("s=%s, len=%d\n", s, l);
  25.         destroy(s);*/

  26. /*
  27.         char *s = trim(" \t \r \n This is a String.  \t \r \n");
  28.         int l = strlen(s);
  29.         printf("s=%s, len=%d\n", s, l);
  30.         destroy(s);*/

  31.         //printf("%c\n", char_at("This is a string.", 1));

  32.         return 0;
  33. }

  34. /*char **split(const char* src, const char *delim) {
  35.         if(src == NULL || delim == NULL) return NULL;

  36.         const char *p = src;
  37.         const char **t = NULL;
  38.         for(; *p != '\0'; p++) {
  39.                
  40.         }

  41.        

  42.         return NULL;
  43. }*/


  44. int first_index_of(const char *src, const char *chs) {
  45.         if(is_empty(src) || is_empty(chs))
  46.                 return -1;

  47.         const char *p = src;
  48.         const char *q = chs;

  49.         int len = strlen(chs);
  50.         int i;

  51.         for(i = 0; *p != '\0' || *q != '\0'; p++, i++) {
  52.                 if(*p == *q++) {
  53.                         if(*q == '\0') break;
  54.                 } else {
  55.                         q = chs;
  56.                 }
  57.         }
  58.         return (*q == '\0') ? (i - len + 1) : -1;
  59. }

  60. int last_index_of(const char *src, const char *chs) {
  61.         if(is_empty(src) || is_empty(chs))
  62.                 return -1;

  63.        
  64. }

  65. bool is_empty(const char *s) {
  66.         return (s == NULL || s == "");
  67. }



  68. /*char *to_lower_case(char *dst, const char *src) {
  69.         if(is_empty(src)) {
  70.                 strcpy(dst, "");
  71.                 return dst;
  72.         }
  73.                
  74.         strcpy(dst, src);
  75.         char *p = dst;

  76.         for(; *p != '\0'; p++) {
  77.                 if(*p >= 'A' && *p <= 'Z') {
  78.                         *p += 32;
  79.                 }
  80.         }

  81.         return dst;
  82. }        */

  83. /*char *to_upper_case(char *dst, const char *src) {
  84.         if(is_empty(src)) {
  85.                 strcpy(dst, "");
  86.                 return dst;
  87.         }

  88.         strcpy(dst, src);
  89.         char *p = dst;

  90.         for(; *p != '\0'; p++) {
  91.                 if(*p >= 'a' && *p <= 'z') {
  92.                         *p -= 32;
  93.                 }
  94.         }
  95.         return dst;
  96. }
  97. */
  98. char *to_lower_case(const char *src) {
  99.         if(is_empty(src)) return "";

  100.         char *dst = (char *)calloc(strlen(src), sizeof(char));

  101.         strcpy(dst, src);
  102.         char *p = dst;

  103.         for(; *p != '\0'; p++) {
  104.                 if(*p >= 'A' && *p <= 'Z') {
  105.                         *p += 32;
  106.                 }
  107.         }

  108.         return dst;
  109. }

  110. char *to_upper_case(const char *src) {
  111.         if(is_empty(src)) return "";

  112.         char *dst = (char *)calloc(strlen(src), sizeof(char));

  113.         strcpy(dst, src);
  114.         char *p = dst;

  115.         for(; *p != '\0'; p++) {
  116.                 if(*p >= 'a' && *p <= 'z') {
  117.                         *p -= 32;
  118.                 }
  119.         }

  120.         return dst;
  121. }

  122. char *ltrim(const char* src) {
  123.         if(is_empty(src))
  124.                 return "";

  125.         const char *p = src;
  126.         while(*p++ != '\0' && isspace(*p))
  127.                 ;

  128.         int len = strlen(p);
  129.         if(len > 0) {
  130.                 char *dst = (char *)calloc(len, sizeof(char *));
  131.                 strcpy(dst, p);
  132.                 return dst;
  133.         }
  134.         return "";
  135. }       

  136. char *rtrim(const char* src) {
  137.         if(is_empty(src))
  138.                 return "";
  139.         int len = strlen(src);
  140.         const char *p = src + len;

  141.         int i;
  142.         for(i = len - 1; i >= 0 && isspace(*(src + i)); i--)
  143.                 ;

  144.         if(i > 0) {
  145.                 char *dst = (char *)calloc(i + 1, sizeof(char *));
  146.                 strncpy(dst, src, i + 1);
  147.                 return dst;
  148.         }
  149.         return "";

  150. }

  151. char *trim(const char* src) {
  152.         return rtrim(ltrim(src));
  153. }

  154. char *substr(const char *src, int start, int len) {

  155.         if(is_empty(src))
  156.                 return "";

  157.         int n = strlen(src);
  158.         if(n < start)
  159.                 return "";

  160.         const char *p = src;
  161.         int i;
  162.         for(i = 0; i < start; i++, p++)
  163.                 ;

  164.         char *dst = (char *)calloc((n - start + 1), sizeof(char));
  165.        
  166.         if(len > 0){
  167.                 strncpy(dst, p, len);
  168.         } else {
  169.                 strcpy(dst, p);
  170.         }
  171.         return dst;
  172. }

  173. void destroy(char * s) {
  174.         if(s == NULL) return;
  175.         if(strlen(s) > 0) free(s);
  176.         s = NULL;
  177. }
復(fù)制代碼

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
2 [報(bào)告]
發(fā)表于 2014-10-26 10:15 |只看該作者
返回的指針未保存,當(dāng)然無法釋放了

論壇徽章:
6
CU大;照
日期:2013-05-20 10:43:41IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-29 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-27 06:20:00CU大;照
日期:2013-05-20 10:44:16CU大;照
日期:2013-05-20 10:44:0615-16賽季CBA聯(lián)賽之廣東
日期:2018-03-09 11:17:08
3 [報(bào)告]
發(fā)表于 2014-10-26 10:17 |只看該作者
回復(fù) 2# hellioncu


非得這樣嗎?

char *s = to_lower_case1("This is a String.");
printf("%s\n", s);
free(s);

   

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
4 [報(bào)告]
發(fā)表于 2014-10-26 14:34 |只看該作者
craaazy123 發(fā)表于 2014-10-26 10:17
回復(fù) 2# hellioncu

對(duì)于你的to_lower_case1,只能這樣

論壇徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16賽季CBA聯(lián)賽之青島
日期:2016-07-05 12:36:0515-16賽季CBA聯(lián)賽之廣東
日期:2016-06-29 11:45:542015亞冠之全北現(xiàn)代
日期:2015-07-22 08:09:472015年辭舊歲徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39獅子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技術(shù)圖書徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [報(bào)告]
發(fā)表于 2014-10-27 08:29 |只看該作者
建議用 方式二

另外,對(duì)于 char *dst = (char *)calloc(strlen(src), sizeof(char *));
首先,根本沒必要用calloc,而應(yīng)該用malloc;其次,不應(yīng)該是sizeof(char *),而應(yīng)該是sizeof(char),同時(shí)strlen(src)應(yīng)該是strlen(src)+1

論壇徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辭舊歲徽章
日期:2015-03-03 16:54:152015年亞洲杯之約旦
日期:2015-02-11 14:38:37雙魚座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29雙子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亞洲杯之科威特
日期:2015-04-17 16:51:51
6 [報(bào)告]
發(fā)表于 2014-10-27 12:47 |只看該作者
返回空的時(shí)候這么寫的:
  1.          if(is_empty(src)) return "";
復(fù)制代碼
其他情況內(nèi)存又是這么申請(qǐng)的:
  1. char *dst = (char *)calloc(strlen(src), sizeof(char *));
復(fù)制代碼
這實(shí)現(xiàn)有問題?盏那闆r下調(diào)用free釋放返回的指針必然是錯(cuò)的。

論壇徽章:
6
CU大;照
日期:2013-05-20 10:43:41IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-29 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-27 06:20:00CU大牛徽章
日期:2013-05-20 10:44:16CU大牛徽章
日期:2013-05-20 10:44:0615-16賽季CBA聯(lián)賽之廣東
日期:2018-03-09 11:17:08
7 [報(bào)告]
發(fā)表于 2014-10-27 14:22 |只看該作者
本帖最后由 craaazy123 于 2014-10-27 14:26 編輯

回復(fù) 5# bruceteen

之前看了個(gè)帖子是這么寫的,當(dāng)時(shí)想都沒想就copy過來了,發(fā)現(xiàn)輸出與預(yù)期一致就沒管了。


   

論壇徽章:
6
CU大;照
日期:2013-05-20 10:43:41IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-29 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-27 06:20:00CU大;照
日期:2013-05-20 10:44:16CU大;照
日期:2013-05-20 10:44:0615-16賽季CBA聯(lián)賽之廣東
日期:2018-03-09 11:17:08
8 [報(bào)告]
發(fā)表于 2014-10-27 14:25 |只看該作者
回復(fù) 6# zhaohongjian000

以前用面向?qū)ο蟮恼Z言用習(xí)慣了,用gcc編譯后也沒告警,不知道這樣返回的問題在哪?能不能解釋一下? 好久沒寫c代碼了

論壇徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辭舊歲徽章
日期:2015-03-03 16:54:152015年亞洲杯之約旦
日期:2015-02-11 14:38:37雙魚座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29雙子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亞洲杯之科威特
日期:2015-04-17 16:51:51
9 [報(bào)告]
發(fā)表于 2014-10-27 14:47 |只看該作者
回復(fù) 8# craaazy123


    C和C++中,字符串字面量(諸如 ""  "string"  "hello")不需要也不能用free釋放。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP