2011-11-01 60 views
0

我一直在寻找解决方案,但还没有找到一个。数组指针函数

我有哪个做一些字符串操作(简体)的函数:

void plr(char str, char *stro){ 
    strcpy(*stro, str); 
} 

我的问题就在于,我无法从功能出来让我的结果:

int main(void){ 
    //string and string out. 
    char str[25], stro[25]; 
    printf("Something please: "); 
    scanf("%s", &str); 

    plr(str, &stro); // So basically stro would be the same as str. 
    printf("Copy succesfull, %s", stro); 
    return 0; 
} 

整个想法是,我有函数pluralis,它将赋予给定的字符串多个,并将其输出到stro。整个字符串操作已经过测试并且可以工作,如果它在main()中,但是我根本无法使它与函数和指针一起工作。我显然可以放弃,但我会从中学到什么。

有什么我需要考虑的时候,它是我指向的数组,而不是一个正常的排序值。

编辑:感谢所有的帮助,它已被解决。非常感谢所有!

+2

STR必须是指针,所以首先,你PRL功能应该是'无效PRL(为const char *海峡,字符* STRO)',由于str是源,它应该通过const。 – Aif

回答

0

无需乱用指针这种方式;)

[email protected]:~$ cat prova.c 
#include <stdio.h> 
#include <string.h> 

void foo(char *strin, char *strout) 
{ 
    strcpy(strout, strin); 
} 

int main(void) 
{ 
    char a[100], b[100]; 

    printf("What's a? "); 
    scanf("%s", a); 

    printf("What's b? "); 
    scanf("%s", b); 

    foo(a, b); 

    printf("a is \"%s\"\nb is \"%s\"\n", a, b); 
} 
[email protected]:~$ gcc prova.c 
[email protected]:~$ ./a.out 
What's a? abc 
What's b? def 
a is "abc" 
b is "abc" 
[email protected]:~$ 

释:
这工作,因为当你使用一个数组的名字它衰减到它的第一个元素的指针。所以foo(a, b)实际上是foo(&a[0], &b[0])。因此,即使ab是数组,将它们传递给函数将它们“转换”为指针。
here报价:

当你传递一个数组作为参数传递给函数,你真传 的指针数组的第一个元素,因为数组衰减到 指针。

和,下面几行:

衰变是一个隐式&; array == & array == & array [0]。在英语中, 这些表达式读“阵列”,“指针数组”,而“指针 阵列的第一个元素”(下标操作符,[],具有比所述地址的操作者更高的优先级 )。但在C中,所有三个表达式都表示同样的意思。

结论是,代码中的问题只是plr的原型。

查找数组指向衰减以获取有关此现象的更多信息。 :)

+0

这很好,但是,我不明白你为什么突然不需要在前面的&符号输出,就像你通常会这样(至少这是我教过的)。如果你能详细说明,将不胜感激。 – Dennis

+0

@Kola:他不需要'&'因为他没有修改指针,只需要指针的副本。相反,他正在修改指针指向的内容。 –

+0

编辑你的答案,使其可读,然后让人们阅读它。 – littleadv

0

也许你需要一个指针的指针,也就是声明你的函数void plr(char str, char **stro)

0

我相信,你的代码更改为:

void plr(char* str, char *stro) 

你想在一个数组str中传递,你必须使用char * str指针。我不认为你可以直接将数组传递给函数。

如果你声明char str [25];编译器为数组保留内存,如果使用char *,它将指向数组中的第一个元素。

我希望这个作品!

GR,

迪特

+0

您可以将数组“直接”传递给函数,但它们仍然按照引用传递。 –

+0

我说得不清楚,对不起。我曾经尝试过使用类似void plr(char str [],char stro [])的东西;这是没有工作^^这就是我正在试图说'直接传递他们':) –

2

你应该这样做:

void plr(char str[], char stro[]) 
{ 
    strcpy(stro, str); 
} 

int main(void) 
{ 
    char str[25], stro[25]; 
    printf("Something please: "); 
    scanf("%s", &str); //unsafe code 

    plr(str, stro); 
    printf("Copy succesfull, %s", stro); 
    return 0; 
} 

使用指针数组或更多的字符串时,请非常小心:

  1. http://pw1.netcom.com/~tjensen/ptr/pointers.htm

使用scanf函数从用户那里得到的字符串是真的更多的是坏事:

  1. Disadvantages of scanf