我已阅读同一主题的帖子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]);
}
给了我一个错误。如何创建一个允许我反转字符串的程序?
答案 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)
答案 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[]) {
.
.
.
}