【问题标题】:Passing strings as pointer to a function [closed]将字符串作为指向函数的指针传递[关闭]
【发布时间】:2014-01-11 20:31:25
【问题描述】:

对于很多人来说这是一个简单的功能,但作为初学者,我还没有克服特别是在字符串方面的指针幻影。我了解 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;
}

【问题讨论】:

  • 定义“不起作用”。我们不知道这应该做什么,也不能强迫我们为您调试代码。
  • 看起来你想要scanf ("%s", s2);而不是scanf ("%s", "s2");
  • 这里我试图从主函数打印名称输入,只要它不大于 20 个字符或为空。我知道这是一团糟,但试图澄清我做错了什么......

标签: c string function pointers


【解决方案1】:

这里有几个错误;可能还有更多:

  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);
    

【讨论】:

  • 感谢您的精彩回复;我正在尝试自己学习这一点,但我发现我缺乏一些基础知识......我想我需要学习更多基础知识并在编写函数之前解决一些问题。真的很感激!
【解决方案2】:

正如上一篇文章所说,i 没有初始化。

还有一行

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

应该是

scanf("%s", s2);

线条

if (s2 == NULL)
    return 0;

else if(n<20)

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

...这是初学者

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

【讨论】:

  • 谢谢!马上买书……
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 2019-08-17
  • 1970-01-01
  • 2013-11-18
  • 2021-10-05
  • 2010-11-19
  • 2013-01-04
  • 2019-04-24
相关资源
最近更新 更多