我一直在寻找解决方案,但还没有找到解决方案。
我有一个函数可以执行一些字符串操作(简化):
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,它会将pluralis附加到给定的字符串并将其输出到stro。整个字符串操作已经过测试并且可以工作,如果它在main()中,但我根本无法使用函数和指针。我显然可以离开它,但我会从中学到什么。
当我指向的数组时,我需要考虑一些事情,而不是正常的排序值。
编辑:感谢所有帮助,它已经解决了。非常感谢所有人!
答案 0 :(得分: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;
}
使用指向数组或字符串的指针时请务必小心:
使用scanf从用户那里获取字符串对于更多事情来说真是件坏事:
答案 1 :(得分:0)
也许您需要一个指向指针的指针,即声明您的函数void plr(char str, char **stro)
答案 2 :(得分:0)
我相信您必须将代码更改为:
void plr(char* str, char *stro)
你想传入数组str,你必须使用指针char * str。
我认为你不能将数组直接传递给函数。
如果你声明char str [25];编译器为数组保留内存,如果使用char *,它将只指向数组中的第一个元素。
我希望这有效!
GR,
迪特
答案 3 :(得分:0)
无需用指针弄乱这种方式;)
blackbear@blackbear-laptop:~$ 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);
}
blackbear@blackbear-laptop:~$ gcc prova.c
blackbear@blackbear-laptop:~$ ./a.out
What's a? abc
What's b? def
a is "abc"
b is "abc"
blackbear@blackbear-laptop:~$
<强>阐释:强>
这是有效的,因为当您使用数组的名称时,它衰减指向其第一个元素的指针。所以foo(a, b)
实际上是foo(&a[0], &b[0])
。因此,即使a
和b
是数组,将它们传递给函数也会将它们“转换”为指针。
引自here:
当您将数组作为参数传递给函数时,您确实会传递 指向数组第一个元素的指针,因为数组衰减为a 指针。
,以下几行:
腐朽是隐含的&amp ;; array ==&amp; array ==&amp; array [0]。用英语讲, 这些表达式读作“array”,“指向数组的指针”和“指向的指针” 数组的第一个元素“(下标运算符,[])具有更高的元素 优先级而不是address-of运算符)。但在C中,这三个 表达意味着同样的事情。
总结一下,代码中的问题只是plr
的原型。
查找数组指针衰减以获取有关此现象的更多信息。 :)