2013-06-06 45 views
1

我正在學習C語言原型的概念,但是我正在努力使用正確的語法。我正在寫一個函數從C-串如何正確地原型C函數

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

char[30] clean(char[30]); 

int main() 
{ 
    char word[30] = "hello"; 
    char cleanWord[30]; 
    cleanWord = clean(word); 
    return 0; 
} 


char[30] clean(char word[30]) 
{ 
    char cleanWord[30]; 
    int i; 

    for(i=0;i<strlen(word);i++) 
     if (isalpha(word[i])) 
      cleanWord[i]=word[i]; 

    cleanWord[i]='\0'; 

    return cleanWord; 
} 

如何正確原型的功能剝離所有非alphbetic字符?什麼是阻止我的程序編譯的其他語法錯誤?

+1

只是以供將來參考:當你提到這個錯誤時,它會幫助你解決編譯器錯誤,併發布你正在收到的** exact **錯誤消息。 (這個問題很容易找出,但未來的問題可能並不那麼清楚。)另外,添加一個模糊的「我可能從這個代碼中得到的其他可能的錯誤是什麼?」並不是一個具體的問題,並且期待我們檢查您的所有代碼以預測其他可能存在的問題是不現實或不恰當的,因爲SO是針對您現在遇到的實際問題的特定問題。它也有助於瞭解您正在使用的編譯器。 –

回答

7

你的問題不是功能原型(又名前向聲明)。你只是不能從C中的函數返回一個數組,也不能分配給一個數組變量。你需要做一些改變才能使事情順利進行。一個選項:

  1. 變化char cleanWord[30]mainchar * cleanWord
  2. 變化cleanchar *clean(char word[30])
  3. 使用malloc簽名分配一個destnation緩衝區內clean
  4. 返回一個指向新的緩衝區
  5. 免費的緩衝區main

而另:

  1. 更改簽名的cleanvoid clean(char word[30], char cleanWord[30])
  2. E在操作傳入的指針,而不是在clean
  3. 變化的本地陣列中main呼叫是clean(word, cleanWord)
3

正如Carl Norum所說,你不能返回一個數組。相反,你傾向於做的是提供輸出:

void clean(const char word[30], char cleanWord[30]) 
{ 
} 

而你應該從該函數中刪除本地範圍的數組。

您會發現該函數無法正常工作,因爲您只有一個迭代器i。這意味着如果一個字符不是字母,你將跳過輸出數組中的一個位置。您將需要第二個迭代器,只有當您將一個字符添加到cleanWord時,迭代器纔會遞增。

+0

對於迭代器的建議。 –

3

有兩點要注意(有點下旬寫了一個答案,似乎我已經被別人毆打他們)

  1. C不能返回局部(堆棧)的對象,如果你想返回從你有一個函數數組malloc

  2. 即使你聲明一個數組參數作爲(char arr[30]),當作爲函數的參數傳遞(char* arr)是一樣數組衰變爲指針爲有效。此外,您將無法通過使用sizeof正確獲取此類陣列的大小。即使它是30,在我的機器上,它返回4爲wordclean,這是指針的大小。

  3. 你缺少一個包括isalpha是我已經更新了你的代碼的ctype.h

一部分,希望我已經猜到你的意圖正確:

#include <stdlib.h> /* for malloc and free */ 
#include <string.h> /* for strlen */ 
#include <ctype.h> /* for isalpha */ 
#include <stdio.h> /* for printf */ 

/* Function declaration */ 
char* clean(char word[30]); 

/* your 'main()' would now look like this: */ 
int main() 
{ 
    char word[30] = "hel1lo1"; 

    char* cleanWord; 

    cleanWord = clean(word); 

    printf("%s\n", cleanWord); 

    free(cleanWord); 

    return 0; 
} 

/* Function definition */ 
char* clean(char word[30]) 
{ 
    char* cleanWord = malloc(30); /* allocating dynamically an array of 30 chars, 
            * no need to use sizeof here as char is 
            * guaranteed to be 1 by the standard 
            */ 

    unsigned int i, j = 0; /* let's fix the problem with non-alpha chars already pointed out */ 

    for (i = 0; i < (strlen(word)); i++) 
     if (isalpha(word[i])) 
      cleanWord[j++] = word[i]; 


    cleanWord[j] = '\0'; 

    return cleanWord; 
    /* return a pointer to the malloc`ed array, don't forget to free it after you're done with it */ 
}