我是编程的新手,我有一个创建一个读取名称的函数的作业。由于某种原因,以下'解决方案'不起作用,输出总是带有奇怪的中文?字符。什么地方出了错?
<?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;
}
}
答案 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;
也错了。 *a
与a[0]
相同,这意味着它是一个
char
。 buff
是char
的数组,因此您将指定一个指向数组的指针
char
到char
个变量。这听起来不对,它正在把苹果放进去
橘子盒子。事实上,正在发生的是您正在分配地址
buff
在a
所指向的记忆中由void input(char *a)
{
scanf("%s", a);
}
指出。
您的编译器应该已经警告过您,不要忽略它
编译器警告,它们可以帮助你,而不是惹恼你,
char name[8];
input(&name);
将是正确的功能。
否则
name
是错误的,即使&name
和name
的地址相同,但是
他们会有不同的类型。 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);
}