1

我正在学习 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;
}

我如何正确地原型化功能?阻止我的程序编译的其他语法错误是什么?

4

3 回答 3

7

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

  1. 变成. char cleanWord[30]_ main_char * cleanWord
  2. 将签名更改cleanchar *clean(char word[30])
  3. 用于malloc在内部分配一个目标缓冲区clean
  4. 返回指向该新缓冲区的指针
  5. 释放缓冲区main

还有一个:

  1. 将签名更改cleanvoid clean(char word[30], char cleanWord[30])
  2. 操作传入的指针而不是本地数组clean
  3. 将调用更改mainclean(word, cleanWord).
于 2013-06-06T02:07:06.147 回答
3

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

  1. C不能返回本地(堆栈)对象,如果你想从一个函数返回一个数组,你必须返回malloc

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

  3. 您缺少一个包含,isalphactype.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 */
}
于 2013-06-06T02:28:00.360 回答
3

正如卡尔诺鲁姆所说,你不能返回一个数组。相反,您倾向于提供输出:

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

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

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

于 2013-06-06T02:12:00.563 回答