我正在学习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;
}
我如何正确地对函数进行原型设计?阻止我的程序编译的其他语法错误是什么?
答案 0 :(得分:7)
您的问题不在于功能原型(即前向声明)。您无法从C中的函数返回数组。也无法分配给数组变量。您需要进行一些更改才能使工作正常进行。一种选择:
char cleanWord[30]
中的main
更改为char * cleanWord
。clean
的签名更改为char *clean(char word[30])
malloc
在clean
main
另一个:
clean
的签名更改为void clean(char word[30], char cleanWord[30])
clean
main
中的来电更改为clean(word, cleanWord)
。答案 1 :(得分:3)
正如Carl Norum所说,你无法返回阵列。相反,你倾向于提供输出:
void clean( const char word[30], char cleanWord[30] )
{
}
您应该从该函数中删除本地范围的数组。
您会发现该函数无法正常工作,因为您只有一个迭代器i
。这意味着如果一个字符不是alpha,你将跳过输出数组中的一个位置。您将需要第二个迭代器,只有在将字符添加到cleanWord
时才会递增。
答案 2 :(得分:3)
一些笔记(写一个答案有点晚了,似乎我被其他人殴打了)
C无法返回本地(堆栈)对象,如果要从函数返回数组malloc
即使您将数组参数声明为(char arr[30])
,(char* arr)
也与数组在作为参数传递给函数时衰减为指针一样有效。此外,使用sizeof
,您将无法正确获得此类数组的大小。即使它是30,在我的机器上它在word
中为clean
返回4,这是指针的大小。
您缺少包含,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 */
}