2013-05-28 230 views
-3
int string_length(char str[]) 
{ 
int i; 
for(i=200; i>=0; i--) 
{ 
    //printf("%c \n",str[200]); 
    printf("%d",i); 
    if(str[i] !=NULL) 
{ 
    return(i); 
    } 
    } 
} 

我想如果字符串返回正確的字符串大小:EEE RRR:它應該返回7但這回200總是數字符串長度c

+0

未定義的短字符串行爲。你爲什麼認爲從200開始向後倒數會起作用? –

+0

如果你傳遞了一個長度爲7的字符串,你需要什麼,爲什麼要在'str [200]'做什麼? – nos

+2

一定是個巨魔吧? –

回答

0

你可以用這個來代替一個。它更簡單

int string_length(char *str) 
{ 
    int i =0; 
    while(*str++) i++; 
    return i; 
} 

,並因爲字符串的邊界外的數據傳遞的是隨機的,大多沒有'\0'您可以使用預定義功能strlen()#include <string.h>

+0

string_length(NULL)和SIGSEGV – jacekmigacz

+4

@jacekmigacz甚至從'#include '的'strlen()'和'strcmp()'不會使NULL指針的檢查。他可以在功能之外進行檢查。 'if(str){len = string_length(str); }' – MOHAMED

+0

MOHAMED:肯定!,那是user2426801的註釋讓他知道 – jacekmigacz

2

它。

決不訪問數組出界,它會導致未定義的行爲。如果你想創建自己的功能,你需要從頭開始。

strlen有什麼問題?

0

儘可能地堅持你原來的代碼

  • 此功能從0向上......沒有200減計數。當它發現一個字符串終止,不爲NULL
  • 此函數結束


int string_length(char str[]) 
{ 
    int i; 
    for(i=0; i<200; ++i) 
    { 
     printf("[%d] : %c \n", i, str[i]); 
     if(str[i] == '\0') 
     { 
      return(i); 
     } 
    } 
} 

或者,如果你想有一個最低限度的功能:

int string_length(char* s) 
{ 
    return (*s)? string_length(s+1)+1 : 0; 
} 
+0

如果你傳遞一個長度爲201的字符串會發生什麼?你不會迎合每一條返回路線。 – RobbieE

+1

@RobbieE:正如我明確指出的那樣,這是爲了儘可能地貼近海報的原始代碼,包括他的限制和設計選擇。 – abelenky

+0

如果兩個字符串之間存在空格,aberlenky ur code不起作用 – kimchi

0

爲什麼你是從第200個角色開始的嗎?您無法預先知道此內存地址是否已分配。您冒着程序崩潰的風險。與此相關的是,您不檢查傳入函數的字符串是否有效(檢查它是否具有非空地址)

相反,從索引0開始並繼續工作。

在c/C++中,字符串的末尾標有'\ 0'字符。嘗試尋找這個而不是NULL(除非你已經將NULL定義爲'\ 0')