2012-06-19 36 views
1

我試圖寫出一些在C.提供的字符串函數我的代碼是實現:誤差mystrlen功能

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

char *mystrcpy(char *s1, char *s2) 
{ 
    while(*s1++ = *s2++); 
    return s1; 
} 

int mystrlen(char *s) 
{ 
    int len = 0; 
    while(*s != '\0') 
    { 
     len++; 
    } 
    return len; 
} 

int main(void) 
{ 
    char arr = "Hi"; 
    char arr1[10]; 
    char arr2[] = "Hello"; 
    int length; 

    mystrcpy(arr1, arr2); 
    printf("%s", arr1); 

    length = mystrlen(arr); 
    printf("%d", length); 

    return 0; 
} 

mystrcpy工作正常,但mystrlen並沒有執行其他的方法。什麼可能是錯誤?以下是該程序終止注:

過程與狀態-1073741510終止(0分鐘,4秒)

此外,還有相關的鑄件少的警告。代碼中有沒有我應該使用任何演員的地方?

+0

在一般情況下,它是閱讀和發佈前消除所有的編譯器警告一個好主意,你的問題:您可能會更快地解決您的問題。 – dasblinkenlight

+0

mystrcpy返回s1的結束,而應該返回頂部。 – BLUEPIXY

+0

@BLUEPIXY:我怎樣才能讓它返回字符串的頂部? –

回答

3

首先,你的mystrlen有一個無限循環。

固定碼:

int mystrlen(const char *s) 
{ 
    int len = 0; 
    while (*s++ /* increment to next character every loop */ != '\0') 
    { 
     len++; 
    } 
    return len; 
} 

還增加const,因爲你永遠不會*s

改變二中提到的數據,分配:char arr="Hi";無效。

您正試圖分配char[]陣列到char變量。正確的形式將是以下一個

char arr[]="Hi"; // array syntax 
char *arr="Hi"; // pointer syntax 

鑑於您的無效arr分配,運行時錯誤很可能造成mystrlen試圖不當尊重arr

你使用什麼編譯器?大多數符合要求的編譯器應該已經發現了第二個問題。如果使用GCC,請將-Wall標誌添加到您的生成文件中。

+0

我使用的是gcc,但沒有捕獲到這個錯誤。這不是一個錯誤? –

+0

@ user1262062,添加'-Wall'標誌。 – hmjd

+0

我很抱歉,但牆標是什麼? –

1

此:

char arr="Hi"; /* Should have caused compiler warning, 
        as is attempting to assign a char 
        to a char[3]. */ 

應該是:

char arr[] ="Hi"; 

或:

char* arr = "Hi"; 
+0

是的......你是對的!我錯誤地聲明瞭該數組 –