C中的简单字符串程序 - 无法打印字符串

时间:2014-01-21 22:16:38

标签: c string

我无法打印字符串。需要一些关于我做错的帮助以及对这些案例中最佳方法的一些见解。

#include<stdio.h>
#include<string.h>

void getName(char *name);

int main()
{
    char name[256];
    getName(name);
    printf("Name = %s\n", name);
    return 0;
}

void getName(char *name)
{
    char line[256];
    printf("Please enter your name! \n");
    gets(line);
    name = (char *) malloc(strlen(line));
    strcpy(name, line);
}

4 个答案:

答案 0 :(得分:3)

你不需要这样做,注释掉它:

name = (char *) malloc(strlen(line));

您已经传入name的缓冲区。您不需要分配第二个缓冲区。

另外,你没有在分配中添加1来解释null终止符,但这无论如何都不相关,因为无论如何都不需要分配。

你可以gets直接进入name并切断line中间人,事实上。

答案 1 :(得分:3)

你有过于复杂的getname() - 它只需要:

void getName(char *name)
{
    printf("Please enter your name! \n");
    gets(name);
}

请注意,gets被广泛认为是unsafe function to use,您应该尝试养成使用fgets的习惯。

答案 2 :(得分:3)

  

我做错了什么

其他人已经指出一些的错误,但是还没有人展示正确的解决方案

您的代码本质上容易受到缓冲区溢出的影响。 gets()函数不允许您指定缓冲区大小,因此如果输入的字符数超过256个,则会写出数组的边界。那很糟糕。

你应该做的是

  1. 不使用单独的功能(因为它在这种特定情况下没有任何好处),并且
  2. 在您的阵列上拨打fgets()

  3. #include <stdio.h>
    
    int main()
    {
        char name[256];
        fgets(name, sizeof name, stdin);
        printf("Name = %s\n", name);
        return 0;
    }
    

    另外,如果您考虑过动态内存分配:

    1. Do not cast. It's a deadly sin.

    2. 检查malloc()

    3. 的返回值
    4. 仍然想要跟踪缓冲区大小;这个函数怎么样?


    5. #define NAME_LENGTH 256
      
      char *getName(void)
      {
          char *buf = malloc(NAME_LENGTH);
          if (buf == NULL) {
              return NULL;
          }
      
          fgets(buf, NAME_LENGTH, stdin);
          return buf;
      }
      

      但是,正如我在评论中提到的那样,在这种情况下,根本不需要动态内存分配。

答案 3 :(得分:0)

我知道指针对于初学者来说可能很复杂。所以,忘记指针。您希望以下代码如何运行?

void change(int a)
{
   a = 10;
}

int main()
{
    int a = 20;
    change (a);
    printf("%d", a);  // It prints 20
}

(如果您确实理解了上述代码,请继续阅读。否则,请阅读变量的函数和范围。)

您的代码具有基本相同的结构,只有而不是int a,您有一个char *名称。请注意,此处有两个不同的名称标识符。一个是getName的参数,另一个是main中定义的常量指针(数组标识符)。更改参数的参数值不会更改调用者参数的值。