2013-07-03 62 views
-4

基本上我所要做的就是重新制作我自己的C字符串。 strlen,strcmp,strcpy和strcat。 下面的代碼是在我的頭文件:沒有被定義編譯錯誤,我不知道如何修復

int mystrlen(const char pcString[]) //strlen function 
{ 
    const char *pcStringEnd = pcString; 

    while (*pcStringEnd != '\0') 
     pcStringEnd++; 

    return pcStringEnd - pcString; 
} 

int mystrcmp(char *s1, char *s2) // strcmp function 
{ 
    while(*s1 == *s2) 
    { 
    if(*s1 == '\0' || *s2 == '\0') 
     break; 

    first++; 
    second++; 
    } 

    if(*first == '\0' && *second == '\0') 
    return (0); 
    else 
    return (-1); 
} 

char mystrcpy(char *s1, const char *s2) // strcpy function 
{ 
    while(*s2) 
    { 
    *s1 = *s2; 
    s2++; 
    s1++; 
    } 

*s1 = '\0'; 
} 

char mystrcat(char *s1, const char *s2) //strcat function 
{ 
    char *string1 = s1; 
    const char *string2 = s2; 
    char *catString = string1 + string2; 
    return catString; 
} 

大多數錯誤是標識符,但事情是,我不能改變不了是我的main.cpp。只有頭文件可以修改。我會把我的main.cpp放在這裏,但它是一個長碼。

{ 
char *string1 = s1; 
const char *string2 = s2; 
char *catString = string1 + string2; //There is an error here with string 2 and catring. 
return catString; 
} 
+2

您是否也可以顯示錯誤? –

+1

1。您沒有將錯誤或足夠的代碼編譯並自己查看。 2.爲什麼你不能改變main.cpp? – PherricOxide

+0

如果您發佈單個代碼示例並告訴我們錯誤是什麼,那麼獲得幫助會更容易。 – juanchopanza

回答

1

有幾個問題與此代碼。

mystrcmp

  1. 參數真的應該const,以防止意外的修改,並允許字符串文字的傳遞。
  2. 變量first未被聲明。
  3. 變量second未被聲明。

mystrcpy

  1. 返回類型應該是一個指針,如果你試圖在標準庫相匹配的功能。
  2. 您需要將值保存在s1中,以便返回。
  3. 您錯過了return語句。

mystrcat

  1. 返回類型應該是一個指針,如果你試圖在標準庫相匹配的功能。
  2. 函數的主體是完全錯誤的。添加兩個指針值不會像您所期望的那樣工作。它會產生一個指針值p1 + p2,並且不訪問或修改它們指向的數據。

下面是您的作業編譯必要的修改。除了mystrcat以外,我沒有測試過它或改變過很多邏輯。我還包括了上面列出的註釋中的評論。

int mystrlen(const char *pcString) //strlen function 
{ 
    const char *pcStringEnd = pcString; 

    while (*pcStringEnd != '\0') 
     pcStringEnd++; 

    return pcStringEnd - pcString; 
} 

// added const to parameters 
// changed first to s1 
// changed second to s2 
int mystrcmp(const char *s1, const char *s2) // strcmp function 
{ 
    while(*s1 == *s2) 
    { 
     if(*s1 == '\0' || *s2 == '\0') 
      break; 

     s1++; 
     s2++; 
    } 

    if(*s1 == '\0' && *s2 == '\0') 
     return (0); 
    else 
     return (-1); 
} 

// changed return type to a pointer 
// added variable to save start of s1 
// added return statement 
char* mystrcpy(char *s1, const char *s2) // strcpy function 
{ 
    char *start = s1; 

    while(*s2) 
    { 
     *s1 = *s2; 
     s2++; 
     s1++; 
    } 

    *s1 = '\0'; 

    return start; 
} 

// changed return type 
// replaced entire function body 
char *mystrcat(char *s1, const char *s2) //strcat function 
{ 
    mystrcpy(s1 + mystrlen(s1), s2); 
    return s1; 
} 
+0

很有意思,爲什麼你把返回s1;在mystrcat fucntion的結尾? – Joe

+0

因爲['strcat'](http://en.cppreference.com/w/c/string/byte/strcat)返回一個指向目標字符串開頭的指針。你可能應該閱讀你需要實現的每個功能的文檔,以便你知道它們應該如何表現。 –

4

您不必爲變量的第一和第二(這裏使用的定義:)

first++; 
second++; 

你必須在函數mystrcmp的開頭添加char* first = /*Whatever*/, *second = /*Whatever*/

但我認爲你真的犯了一個錯誤,你想寫

s1++; 
s2++; 

代替以上的片段(以及進一步在同一個函數)

相關問題