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

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

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: gaochang2008
打印 上一主題 下一主題

[算法] 不簡單的strlen長度計算, [復(fù)制鏈接]

論壇徽章:
0
61 [報告]
發(fā)表于 2009-05-14 09:22 |只看該作者
原帖由 tbocd 于 2009-5-14 00:19 發(fā)表

這樣行不?
int strlen(char *p)
{
    return (sizeof(p)/sizeof(char) - 1);
}



肯定不行了,p是一個指針,sizeof(p) == 4

論壇徽章:
5
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亞冠之水原三星
日期:2015-06-02 16:34:202015年亞冠紀(jì)念徽章
日期:2015-10-19 18:13:37程序設(shè)計版塊每日發(fā)帖之星
日期:2015-11-08 06:20:00
62 [報告]
發(fā)表于 2009-05-14 10:29 |只看該作者
原帖由 NeteLife 于 2009-5-14 09:21 發(fā)表




使用范圍太狹窄了

_Strlen("aabbccdd"; // error
p = "aabbccdd";
_Strlen(p); // error


Just for


  1. char p[]="xxxxxxxxxxxxxxxxxxxxxxxx";

復(fù)制代碼

論壇徽章:
0
63 [報告]
發(fā)表于 2009-05-14 13:21 |只看該作者

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

  3. int lenstr(char *p)
  4. {
  5.     __asm__ __volatile__(
  6.             "movb $0, %%al\n\t"
  7.             "movl $0XFFFFFFFF, %%ecx\n\t"
  8.             "cld\n\t"
  9.             "repne scasb\n\t"
  10.             "negl %%ecx\n\t"
  11.             "subl $2, %%ecx\n\t"
  12.             "movl %%ecx, %%edi\n\t"
  13.             :"=&D"(p)
  14.             :"0"(p)
  15.             :"eax", "ecx"
  16.             );
  17.     return (int)p;
  18. }

  19. int main(int argc, char* argv[])
  20. {
  21.     char * p = "i am a string!";

  22.     printf("%s=%d\n", p, lenstr(p));
  23.     printf("%s=%d\n", p, strlen(p));

  24.     return 0;
  25. }

  26. 13:17:10 root /mnt/windows/code/user-prg/mixed-c-asm # gcc strlen.c
  27. 13:17:30 root /mnt/windows/code/user-prg/mixed-c-asm # ./a.out
  28. i am a string!=14
  29. i am a string!=14
  30. 13:17:32 root /mnt/windows/code/user-prg/mixed-c-asm # uname -a
  31. Linux linux-2148 2.6.16.21-0.8-default #1 Mon Jul 3 18:25:39 UTC 2006 i686 i686 i386 GNU/Linux

  32. 這樣也算是沒有定義變量吧
復(fù)制代碼

論壇徽章:
0
64 [報告]
發(fā)表于 2009-05-14 13:56 |只看該作者

回復(fù) #63 sanbiangongzi 的帖子

還有一個版本

  1. int lenstr2(char *p)
  2. {
  3. #define i (*(int*)(&p - 3))
  4.     for(i=0; p[i]; i++);
  5.     return i;
  6. #undef i
  7. }
復(fù)制代碼

論壇徽章:
0
65 [報告]
發(fā)表于 2009-05-14 14:06 |只看該作者
指針的地址減3是什么意思

論壇徽章:
0
66 [報告]
發(fā)表于 2009-05-14 15:04 |只看該作者

回復(fù) #65 暗底 的帖子

|                    |  
  +--------------------+  
  |        p           |  
  |                    |  
  +--------------------+  
  |                    |  
  |        ret         |  
  +--------------------+  
  |                    |  
  |        ebp         |  
  +--------------------+  
  |                    |  
  |        here is &p-3|  
  +--------------------+  
  |                    |

論壇徽章:
0
67 [報告]
發(fā)表于 2009-05-14 15:09 |只看該作者
原帖由 sanbiangongzi 于 2009-5-14 13:21 發(fā)表

#include
#include

int lenstr(char *p)
{
    __asm__ __volatile__(
            "movb $0, %%al\n\t"
            "movl $0XFFFFFFFF, %%ecx\n\t"
            "cld\n\t"
            "repne  ...

這個僅適用于x86 CPU這種簡單情況...

論壇徽章:
0
68 [報告]
發(fā)表于 2009-05-15 16:43 |只看該作者
呵呵,我首先想到的就是遞歸

論壇徽章:
0
69 [報告]
發(fā)表于 2009-05-15 16:50 |只看該作者
原帖由 daybreakcx 于 2009-5-13 18:44 發(fā)表
為了避免輸出其他信息,在41樓基礎(chǔ)上改成這樣
int Strlen(char* p)
{
        return (sprintf(p,p));
}
當(dāng)然,對于常量字符串就不行了,會出錯的

如果p是數(shù)組是可以的,如果p是指向數(shù)組的指針則不行
如: char ar[100] sizeof(ar)/sizeof(char) 可以
char ar[100], *p=ar; sizeof(p)/sizeof(char)不行

論壇徽章:
0
70 [報告]
發(fā)表于 2009-05-15 17:58 |只看該作者
原帖由 皇家救星 于 2009-5-12 22:38 發(fā)表

int strlen(char *p)  // 注意! 不允許定義任何變量
{
  if( *p )
  return strlen(p + 1)+ 1;
  return 0;
}


您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(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