2013-06-06 66 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 */ 
}