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

  免費注冊 查看新帖 |

Chinaunix

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

[C] 關(guān)于字符長度的詭異現(xiàn)象 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-09-12 13:04 |只看該作者 |倒序瀏覽
本帖最后由 blackgenius 于 2010-09-21 09:36 編輯

我寫了這么一段代碼,測試字符串和字符數(shù)組的長度問題,測試strlen和sizeof函數(shù)的異同,結(jié)果有一處很不明白,先看程序
  1. #include <stdio.h>
  2. #include <string.h>

  3. int
  4. main()
  5. {
  6.     char str[5] = “12345”;
  7.     char *pstr;
  8.     int i;

  9.     void test(char str[5]);

  10.     pstr = "12345";
  11.     printf("In the main func\n");
  12.     for (i=0; i<5; i++)
  13.         printf("%c\n", str[i]);
  14.     printf("%s\n", pstr);
  15.     printf("sizeof(str[]): %d\n", sizeof(str));
  16.     printf("strlen(pstr): %d\n", strlen(pstr));
  17.     printf("For the array:\n");
  18.     test(str);
  19.     printf("For the pointer:\n");
  20.     test(pstr);
  21.     return 0;
  22. }

  23. void test(char str[5]) {
  24.     int s;
  25.     s = sizeof(str);
  26.     printf("%s\n", str);
  27.     printf("The value of sizeof func: %d\n", s);
復制代碼
這個程序運行的結(jié)果如下:




首先,語句For the array: 之后跟的打印結(jié)果,結(jié)尾出現(xiàn)亂碼是和原因?
其次,在array情況下,sizeof的值為什么會是4?<在pointer情況下sizeof的值為4是因為字符串只能用strlen去求長度,sizeof得到的會是指針本身的值的長度(long型)>
最后,為什么函數(shù)形參設為char str[5]型,對于字符數(shù)組,傳參到函數(shù)之后,打印其sizeof的值時得到的是4?

高手指點迷津,小生謝過~


發(fā)現(xiàn)我太幼稚了,仔細查了一下,當我的函數(shù)用數(shù)組做形參時,等價于傳遞了數(shù)組的首地址給函數(shù),意味著在函數(shù)中使用sizeof函數(shù)求得的都是等價于對字符串指針求sizeof,得到的是地址所占的空間大小,也就是一個long型的數(shù)據(jù)sizeof的大小。T T只笑自己太幼稚啊~哈哈!不過還請指點,Array情況下輸出為什么出現(xiàn)了亂碼?


-------------
2010-09-21
今天我再次發(fā)現(xiàn)這個問題的詭異,發(fā)現(xiàn)當時的我太過于天真了~我上面的解釋都是有問題的,我認為;
我想請教高手,為什么同樣是sizeof(str),為什么在test函數(shù)外面,得到的是5;而在test函數(shù)里面,得到的卻是4?傳給sizeof的都是地址啊,如果說對于字符串只能用strlen去求長度,那為什么在main函數(shù)里test函數(shù)外的時候我們也可以sizeof求得正確值?而且我自己回憶,經(jīng)常對于字符串sizeof,以此來初始化一個字符數(shù)組。我已經(jīng)快暈厥了~請高手指教!


經(jīng)過自己的測試,終于算是結(jié)了這個問題了,呵呵~字符數(shù)組的sizeof是數(shù)組的長度,而字符指針的sizeof是long的長度,所以在main里test外,sizeof str得到的會是正確的數(shù)組長度,而當數(shù)組作為參數(shù)傳遞到函數(shù)test時,數(shù)組被強制類型轉(zhuǎn)換成為字符指針,因為在test函數(shù)里面得到的是錯誤的值。在這里糾正一下我上面的說法^_^

論壇徽章:
0
2 [報告]
發(fā)表于 2010-09-12 13:31 |只看該作者
sprintf不是那么用吧,

sprintf(char *str, const char *format,...)

論壇徽章:
0
3 [報告]
發(fā)表于 2010-09-12 13:39 |只看該作者
第一個問題,因為把12345裝在str[5]里表示的不是一個合法的字符,后面應該還有一位'\0'

第二個問題,當數(shù)組當作函數(shù)參數(shù)時它就是一個指針

論壇徽章:
0
4 [報告]
發(fā)表于 2010-09-12 13:41 |只看該作者
回復 2# kingoftime3
跟那個沒有關(guān)系

論壇徽章:
0
5 [報告]
發(fā)表于 2010-09-12 13:44 |只看該作者
回復 3# kingoftime3

我也考慮是這一點,作為字符數(shù)組,是不需要'\0'的,只是作為字符串的時候才需要'\0'。這樣考慮應該是對的,因為沒有'\0'所以導致當傳到函數(shù)中以%s輸出時它不是一個合法的字符串,除了12345這五位之外,還把后面的內(nèi)容輸出了~我們考慮的應該是一樣的,還是謝謝你~
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP