如何将数组作为参数传递给函数?

时间:2016-01-31 11:44:34

标签: c arrays

我已阅读同一主题的帖子here,但它似乎没有解决我的问题。

如果我需要编写一个函数str_reverse()来反转传递给它的任何字符串,我该怎么办呢?就像上面提到的问题的人一样,以下代码

#include <stdio.h>
#include <string.h> //for strlen

#define maxL 300 //Max String Length

void str_reverse(char);

int main(){

    //Variables
    char x[maxL];

    //User Prompt
    printf("Enter a string no longer than %d characters: ", maxL);
    gets(x);
    str_reverse(x);

    //Return Statement
    return 0;
}

void str_reverse(char x){
    int i, l;
    l = strlen(x);
        printf("In reverse: ");
        for(i=l-1; i>=0; i--)
            printf("%c",x[i]);
}

给了我一个错误。如何创建一个允许我反转字符串的程序?

4 个答案:

答案 0 :(得分:3)

您传递正常,但功能未正确接收。将其更改为:

void str_reverse(char *x){
..
}

和原型:

void str_reverse(char*);

此外,gets()是危险的,永远不应该使用。请改用fgets()

if( fgets(x, sizeof x, stdin) == NULL) { /* failure */ }

x[strcspn(x,"\n")] = 0; // to remove the trailing newline, if any.

答案 1 :(得分:1)

您可以将数组作为类型arr []或类型*指针传递。你必须将长度作为参数传递给你的字符串反转函数。字符串反向的新声明将如下所示:

void str_reverse(char *x,int length)

void str_reverse(char x[],int length)

有关详情,请点击Length of array in function argument

答案 2 :(得分:1)

声明为数组的函数参数被调整为指向数组元素的指针。

因此,这些函数声明是等效的,并声明相同的一个函数

#define maxL 300 
void str_reverse(char[maxL]);

void str_reverse(char[10]);

void str_reverse(char[1000]);

void str_reverse(char[]);

void str_reverse( char *);

另一方面,当数组作为参数传递给函数时,它会被隐式转换为指向其第一个元素的指针。

所以这个函数调用

char x[maxL];
//...
str_reverse(x);

可以想象像

char x[maxL];
//...
char *tmp = x;
str_reverse(tmp);

考虑到函数gets不安全,C标准不再支持。

使用标准函数fgets

如果函数返回指向其第一个字符的指针,那就更好了。

您的函数不会尝试反转字符串。它尝试以相反的顺序输出字符串。

所以确实反转字符串的函数可以写成

char * str_reverse( char *s )
{
    size_t n = strlen( s );

    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n- i-1];
        s[n-i-1] = c;
    }  

    return s;
}

这是一个示范程序

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

#define maxL 300 //Max String Length

char * str_reverse( char *s )
{
    size_t n = strlen( s );

    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n- i-1];
        s[n-i-1] = c;
    }  

    return s;
}

int main( void ) 
{
    //Variables
    char s[maxL];

    //User Prompt
    printf("Enter a string no longer than %zu characters: ", maxL);
    fgets( s, maxL, stdin );
    s[strcspn( s, "\n" )] = '\0';

    puts( str_reverse( s ) );

    return 0;
}

它的输出可能看起来像

Enter a string no longer than 300 characters: Hello, World!
!dlroW ,olleH

答案 3 :(得分:0)

您可以通过多种不同方式实现这一目标:

选项-1 正式参数作为指针 -

void myFunction(char *param) {
   .
   .
   .
}

选项-2 正式参数作为大小的数组 -

void myFunction(char param[10]) {
   .
   .
   .
}

选项-3 正式参数作为未确定的数组 -

void myFunction(char param[]) {
   .
   .
   .
}