创建一个读取(字符串)输入的函数

时间:2018-01-28 18:50:49

标签: c

我是编程的新手,我有一个创建一个读取名称的函数的作业。由于某种原因,以下'解决方案'不起作用,输出总是带有奇怪的中文?字符。什么地方出了错?

<?php

namespace App\Services\Shouter\Sources;

use Psr\SimpleCache\CacheInterface;

class Twitter
{
    /**
     * Cache instance
     * @var Psr\SimpleCache\CacheInterface
     */
    protected $cache;

    public function __construct(CacheInterface $cache)
    {
        $this->cache = $cache;
    }
}

5 个答案:

答案 0 :(得分:3)

我认为问题出在你的

    *a = buff;

声明,因为buff没有你职能之外的生命。因此它的记忆将会丢失..因此以这种方式尝试使用buff是不安全的......

[但正如@pablo指出的那样*a = buff;将复制buff的地址并将其放入分配给a的内存中,这实际上不是你想要的去做。 ]

下面的

应该有效,并且包含来自您的功能的return

#include <stdio.h>
#include <stdlib.h>

void input(char* a);

int main()
{
    char name[8];

    input(&name);

    printf("%s", name);

    return 0;
}

void input(char* a)
{
   // char buff[8];

    scanf("%s", a);

  //  *a = buff;
    return;
}

另一点是检查你是否确定这个名字只有8个字符...为什么不把它作为50个字符呢?

答案 1 :(得分:1)

首先,您应该将数组传递给函数input()而不是其地址。其次,将scanf("%s", buff)替换为scanf("%s", a)。这会将字符串直接存储在传递给函数的数组中。

因此,固定代码应如下所示:

#include <stdio.h>
#include <stdlib.h>

void input(char* a);

int main(void)
{
    char name[8];

    input(name);

    printf("%s\n", name);

    return 0;
}

void input(char* a)
{
    scanf("%s", a);
}

您的代码无法工作的原因是,您尝试将本地数组buff的地址分配给传递给函数的数组的第一个元素。这不应该编译,否则编译器必须发出警告!如果你的编译器允许它通过而没有任何这些,那就是一场灾难。

最后,main函数应声明为int main(void)int main(int argc, char **argv)

答案 2 :(得分:1)

*a = buff;不会将buff复制到a。使用strcpy()作为

strcpy(a,buff);

完整代码:

void input(char* a);
int main()
{
        char name[8];
        //input(&name);/** no need to pass & bcz name itself represents address */
        input(name);
        printf("[%s]", name);
        return 0;
}
void input(char* a) {
        char buff[8];
        scanf("%s", buff);
        //*a = buff; /* not valid **/
        strcpy(a,buff);
}

答案 3 :(得分:1)

此功能有问题:

void input(char* a)
{
    char buff[8];

    scanf("%s", buff);

    *a = buff;
}

buff是局部变量,只有在input()运行时才有效,所以 返回此变量是错误的。

*a = buff;也错了。 *aa[0]相同,这意味着它是一个 charbuffchar的数组,因此您将指定一个指向数组的指针 charchar个变量。这听起来不对,它正在把苹果放进去 橘子盒子。事实上,正在发生的是您正在分配地址 buffa所指向的记忆中由void input(char *a) { scanf("%s", a); } 指出。 您的编译器应该已经警告过您,不要忽略它 编译器警告,它们可以帮助你,而不是惹恼你,

char name[8];

input(&name);

将是正确的功能。

否则

name

是错误的,即使&namename的地址相同,但是 他们会有不同的类型。 char*衰变成一个指针,所以它是一个 &name。但是char是指向bar数组的指针,这是一种不同的类型。 编译器应该给你一个警告:

  

警告:从不兼容的指针类型中传递char *的参数1   注意:预期char (*)[8]但参数类型为input(name);

正确的电话是:

scanf

一般来说,存在一个大问题:你只需要声明8个空格 缓冲。如果名称超过7个字符,您将拥有一个缓冲区 溢出。我建议不要使用fgets而是使用char name[30]; fgets(name, sizeof(name), stdin); name[strcspn(name, "\n")] = 0; // removing possible newline ,因为 在这里,您可以更好地控制输入和内存边界。

scanf

fgets并不总是易于使用。名称可以很长并且在其中包含空格。 特别适合初学者,这可能很棘手。 D3DX11Effect.h更易于使用。

答案 4 :(得分:0)

您不需要传递name的地址,因为它是一个char数组。当您在input()中复制时,应使用strcpy。以下代码有效:

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

void input(char* a);

int main()
{
  char name[8];

  input(name);

  printf("%s", name);

  return 0;
}

void input(char* a)
{
  char buff[8];

  scanf("%s", buff);

  strcpy(a, buff);
}