将字符串作为指向函数的指针传递

时间:2014-01-11 20:31:25

标签: c string function pointers

对于许多人来说这是一个简单的功能,但作为一个初学者,我还没有特别在弦乐时克服指针幽灵。我理解strcmp,strcpy,strlen的一些示例以及如何使用NULL终止符在内存中分配字符。我想我也明白了内存中的指针变量如何指向int var或char等的地址,并通过将它们解引用到var / char来分配它们,但每当我尝试编写代码时,指针鬼来了回来咬我 所以,在这里我试图运行它并且不起作用。如果你能为我澄清一下,我将不胜感激......

//GETNAME function should return a string that is not NULL and less than 20 characters

char getname (char *s1)
{
int i, n;
char s2[i];
printf ("Enter your name:" );
scanf ("%s", "s2");

if (s2 == NULL)
    return 0;

else if(n<20)

for ( i=0, n =strlen (s2 + 1); i<n; i++)

*(s1+i) = s2[i]; //copy characters from s2 and point to chars of s1

return *s1; 
}

int main (int argc, char *argv[])   

{       
    char name[20];
    char urname;

    urname = getname(name);

    printf (" Your name is : %s\n", urname);

    getch();

return NULL;
}

2 个答案:

答案 0 :(得分:3)

以下是几个错误;可能还有更多:

  1. 未初始化的变量:

    int i, n;
    char s2[i];
    

    i未在此初始化,但您可以像使用它一样使用它。 i应该有什么价值?像这样,它是未定义的行为。

  2. scanf的参数不正确:

    scanf ("%s", "s2");
    

    第二个参数应该是指向要将输入写入的内存的指针,而不是常量字符串。它应该是:

    scanf ("%s", s2);
    
  3. strlen的参数不正确:

    for ( i=0, n =strlen (s2 + 1); i<n; i++)
    

    你想将1添加到字符串长度而不是字符串本身,所以它应该是

    for ( i=0, n = strlen(s2) + 1; i<n; i++)
    
  4. getname的常见问题,包括返回类型:

    char getname (char *s1)
    

    为什么这个功能如此复杂?您可以直接scanf加入参数s1。任何事情你都不需要s2。返回类型也是错误的。你返回一个指针,而不是一个char。它应该是:

    char* getname(char *s1)
    
  5. 未正确处理getname的返回值:

    char urname;
    urname = getname(name);
    

    getname返回指向char的指针,而不是单个char。它应该是:

    char* urname;
    urname = getname(name);
    

答案 1 :(得分:0)

正如之前的帖子所说,i未初始化。

也是行

scanf("%s", "s2");

应该是

scanf("%s", s2);

if (s2 == NULL)
    return 0;

else if(n<20)

不正确,因为s2不会为NULL且n未初始化

......那是初学者

我建议你买一本书并阅读它