2014-11-21 69 views
1

在這個程序中,我試圖計算並打印字符串的長度而不使用strlen()。 爲什麼它總是打印「長度爲:0」計算並打印字符串的長度而不使用strlen()

#include <stdio.h> 

int length(char str[]) 
{ 
    int a_string; 
    for (a_string=0;str[a_string]!='\0';++a_string) 
    { 
     return a_string; 
    } 
} 

int main() 
{ 
    char line[80]; 
    printf("Enter string:\n"); 
    fgets(line,sizeof(line), stdin); 
    printf("Length (including newline) is: %d\n",length(line)); 
    return 0; 
} 

回答

0

不是最漂亮的變體,而是最快的變體。 然而,總是使用標準的功能,它往往是用匯編語言編寫的一個特定的架構,最快速,你可以在C

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

size_t my_strlen(char *a) 
{ 
     char *b; 
     for (b = a; *a; a++); 
     return a - b; 
} 

int main(void) 
{ 
     char *str = "Hello world"; 
     printf("str len %d\n", my_strlen(str)); 
     return 0; 
} 
在你的代碼

寫你需要改變

for (a_string=0;str[a_string]!='\0';++a_string) 
{ 
    return a_string; 
} 

for (a_string=0;str[a_string]!='\0';++a_string) 
    { 
     ; 
    } 
return a_string 
4

return語句是在循環內,因此它退出馬上在第一次迭代。在循環之後移動它。

1

在您的for循環中,您立即返回a_string,這將首次具有0的值。相反,您應該在循環完成後返回a_string

1

取回for循環的外部。當你的代碼現在,返回被用於循環的每一次迭代。這不是你想要的。 更改您的代碼:

int length(char str[]) 
{ 
    int a_string; 
    for (a_string=0;str[a_string]!='\0';++a_string) 
    { 
    } 
     return a_string; 
} 

現在這個循環運行,並在此處a_string就等於字符串的大小,並返回將被稱作循環的一次迭代後結束其運行後,才,而不是。

0

的另一種方式,沒有strlen()並且不增加計數器:

int length(char *str) 
{ 
    const char *w = str; 

    while(*str) 
    str++; 

    return str - w; 
} 
0
the code should not return until AFTER the calculation is complete. 
currently the code returns before ever doing any counting 
suggest the following, which you might evaluate to assure the 
returned value does not include the null byte 

int length(char* str) 
{ 
    int a_string; 
    for (a_string=0; str[a_string]!='\0'; ++a_string); 

    return a_string; 
} 
相關問題