【问题标题】:My Output has some weird symbols displaying我的输出显示了一些奇怪的符号
【发布时间】:2016-01-21 18:12:54
【问题描述】:

我必须为我的班级编写代码。编码是关于要求用户输入他们的姓名、年龄和 ID。然后程序应该根据他们姓名中的前 6 个字母、他们的年龄和学生 ID 中的前两个字母来输入密码。问题是输出中的不明符号(╠╠╠╠╠╠╠╠╠╠╠╠╠╠)。谁能告诉我为什么会在那里>?然后它应该计算并显示密码的长度。代码如下:

#include <stdio.h>
#include <string.h>
void main(void)
{
char name[20], id[9], age[3], passcode[10];
int x;


puts("Enter your name:\n");
gets(name);

puts("\nEnter your student id:\n");
gets(id);

puts("\nEnter your age:\n");
gets(age);

x = strlen(passcode);

strncpy(passcode, name, 6);
strncat(passcode, id, 2);

printf("The passcode is:%s \n",passcode);
printf("The passcode has %d characters..\n",x);

}

它看起来像:

Enter your name:

johnny

Enter your student id:

dc87671

Enter your age:

20
The passcode is:johnny╠╠╠╠╠╠╠╠╠╠╠╠╠╠20dc
The passcode has 22 characters..
Press any key to continue . . .

【问题讨论】:

  • 您不应该使用 get 从标准输入读取字符串。使用 fgets() 或 getline() 等函数

标签: c strcat strncpy


【解决方案1】:

密码有 22 个字符

但您为密码分配了一个 10 个字符的缓冲区

passcode[10]

您不是空终止密码。来自strncpy的备注

如果 source 长于 num,则不会在目标末尾隐式附加空字符。因此,在这种情况下,destination 不应被视为以 null 结尾的 C 字符串(这样读取它会溢出)。

还要注意这一行

x = strlen(passcode);

在初始化之前对密码进行操作。因此,它将包含随机位,导致 x 的值没有很好地定义。您目前不使用 x,因此它不会直接影响手头的问题。

【讨论】:

  • 考虑使用fgets而不是gets,因为它将最大长度作为参数-stackoverflow.com/questions/4346598/gets-function-in-c
  • @ericJ 那么我应该怎么做才能让我的代码运行呢?
  • 您需要添加一个空终止符,例如复制名称后密码[6] = '\0'。您还需要处理名称少于 6 位的情况,例如“埃里克”。您可以用空格填充较短的名称,或者您可以将 6 更改为 min(strlen(name), 6);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
相关资源
最近更新 更多