如何正确原型C函数

时间:2013-06-06 02:03:41

标签: c

我正在学习C语言中的原型设计概念,但是我正在努力学习正确的语法。我正在编写一个函数来从c-string中删除所有非字母字符

#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;
}

我如何正确地对函数进行原型设计?阻止我的程序编译的其他语法错误是什么?

3 个答案:

答案 0 :(得分:7)

您的问题不在于功能原型(即前向声明)。您无法从C中的函数返回数组。也无法分配给数组变量。您需要进行一些更改才能使工作正常进行。一种选择:

  1. char cleanWord[30]中的main更改为char * cleanWord
  2. clean的签名更改为char *clean(char word[30])
  3. 使用mallocclean
  4. 中分配目标缓冲区
  5. 返回指向新缓冲区的指针
  6. 释放main
  7. 中的缓冲区

    另一个:

    1. clean的签名更改为void clean(char word[30], char cleanWord[30])
    2. 操作传入的指针而不是clean
    3. 中的本地数组
    4. main中的来电更改为clean(word, cleanWord)

答案 1 :(得分:3)

正如Carl Norum所说,你无法返回阵列。相反,你倾向于提供输出:

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

您应该从该函数中删除本地范围的数组。

您会发现该函数无法正常工作,因为您只有一个迭代器i。这意味着如果一个字符不是alpha,你将跳过输出数组中的一个位置。您将需要第二个迭代器,只有在将字符添加到cleanWord时才会递增。

答案 2 :(得分:3)

一些笔记(写一个答案有点晚了,似乎我被其他人殴打了)

  1. C无法返回本地(堆栈)对象,如果要从函数返回数组malloc

  2. 即使您将数组参数声明为(char arr[30])(char* arr)也与数组在作为参数传递给函数时衰减为指针一样有效。此外,使用sizeof,您将无法正确获得此类数组的大小。即使它是30,在我的机器上它在word中为clean返回4,这是指针的大小。

  3. 您缺少包含,isalpha属于ctype.h

  4. 我已经更新了您的代码,希望我已经正确地猜到了您的意图:

    #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 */
    }