【问题标题】:Is this array increasing or what did it do?这个数组是在增加还是它做了什么?
【发布时间】:2019-12-01 14:08:24
【问题描述】:

我试图制作一个程序,您首先插入一个数字来表示您的名字有多少字母。然后我想得到你的名字(使用数组)。这个程序的问题是,如果我为N 插入1,然后插入比我们在开始时输入的字母更多的name。为什么这行得通,我得到了全名?

第二个问题是如何将char 转换为int 所以如果用户在他们的名字中插入了多少个字母的数字,然后插入一个包含更多字母的名字,我可以打印“错误你为您的名字插入比预期更多的字母”?

#include <stdio.h>
int main()
{
    int N;
    printf("Insert how much letter does your name have");
    scanf("%d",&N);
    char name[N];
    printf("Insert your name ");
    scanf("%s",&name);
    printf("You insert %s",name);

    return 0;
}

【问题讨论】:

  • 您忘记了需要一个元素来存储字符串的\0-终止符。如果您像现在一样进行操作,您将很容易陷入缓冲区溢出。 scanf() 也应该有一个长度修饰符以避免完全相同的事情。
  • N 个字符的数组没有足够的元素用于 N 个字符的名称。终止空值需要 +1。越界写入具有未定义的行为,可接受的行为之一是完全忽略情况,结果不可预测。要读取名称,您可以分配一个数组,该数组允许名称 一个 比预期的大,然后如果名称确实那么长则出错...
  • 您的 scanf() 调用使用 %s 没有最大长度修饰符,因此会愉快地写出您的数组范围,这是未定义的行为。

标签: c arrays


【解决方案1】:

这个程序的问题是,如果我为 N 插入 1,然后 插入比我们在开始时输入的字母更多的名字。为什么 这行得通,我得到了全名?

它(在您的情况下)起作用的原因称为“未定义行为”。如果您在程序中插入此类问题,您将无法期望/保证任何事情。可能会出现正确的值,但很可能在另一个实现中你会得到完全不同的结果。永远避免类似的事情,并以正确的方式进行编程,并专注于您实际所做的事情。

这里是关于什么是 UB 的更多信息的链接:Undefined, unspecified and implementation-defined behavior

如何将char 转换为int 所以如果用户插入数字 他名字里有多少个字母,后来插入一个名字 更多字母,我可以打印“错误你为你的名字插入更多字母 然后预期”?

我不明白,为什么 charint 的转换在这种情况下会有所帮助。相反,您应该使用strlen() 扫描name,以了解该字符串包含多少个字符,然后根据strlen() 的返回值创建一个if/else 语句。

正如我在评论中已经提到的,但两次更好:

你忘了你需要一个元素来存储字符串的\0-终止符,如果你使用scanf("%s",&amp;name);,它会自动插入到字符串的末尾,所以name应该声明为@987654334 @。如果你像现在这样,你很容易陷入缓冲区溢出。此外,如果可能,scanf() 应该有一个宽度修饰符以避免完全相同的事情,即使宽度在编译时没有固定并在运行时生成。使用变量(非固定)宽度修饰符的技巧,如果你想合并一个,你需要它,写在这个问题的一个答案中:

Width Specifier for scanf() - Length of characters to consume is not fixed at compilation and only determined at run-time. How to make it variable?

永远记住:让您的程序尽可能安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-22
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多