为什么超过44个字符时打印随机符号

2024-05-09

我正在从《C 编程:现代方法》一书中学习 C。现在我正在进行有关数组的练习。练习之一是编写一个过滤器,以不同的方式打印输入消息。

到目前为止(参见下面的代码),一切正常,直到字符数超过 44,然后它打印随机符号。如果字符数低于 44,则一切正常。我完全不知道为什么会这样做。问题出在哪里以及可能的解决方案是什么?

int i = 0, k = 0;
char message[k],ch;

printf("Enter a message: ");
while(toupper(ch = getchar()) != '\n')
{
    message[k] = ch;
    k++;
}
printf("In B1FF-speak: ");
for (i = 0; i <= k - 1; i++)
{
    switch(toupper(message[i]))
    {
        case 'A':
            printf("4");
            break;
        case 'B':
            printf("8");
            break;
        case 'E':
            printf("3");
            break;
        case 'I':
            printf("1");
            break;
        case 'O':
            printf("0");
            break;
        case 'S':
            printf("5");
            break;
        default:
            printf("%c", toupper(message[i]));
            break;
    }
}

int i = 0, k = 0;
char message[k],ch;

你已经定义了message as a 变长数组(VLA)。 (这是 1990 年版本的 C 中不存在的功能;它是由 1999 年标准添加的,并在 2011 年标准中成为可选的。)

由于值k is 0,长度message is 0。 C 不支持零长度数组。定义常量长度为零的数组是非法的(违反约束,需要诊断)。定义长度为零的可变长度数组具有未定义的行为。

VLA 的长度在定义时是固定的。改变值k稍后不会更改数组的长度。您的代码似乎假设它会。

你的程序seems工作长度可达 44。这就是未定义行为的本质。这worst可能发生的事情是你的程序似乎“正确”工作;这只是意味着您有一个难以检测的错误。

如果您想在数组中存储任意多个元素,您可以首先将其定义为足够大的大小(可能很难或不可能确定它必须有多大),或者您可以使用realloc()动态分配数组并根据需要扩展它。 (realloc()实际上并没有扩展数组;它创建一个更大大小的新数组,并将旧数组的内容复制到新数组中。如果没有足够的可用内存,它可能会失败;始终检查它返回的值以确定它是成功还是失败。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么超过44个字符时打印随机符号 的相关文章

  • 将列表数组中的值绑定到列表框

    任何机构都可以给出一个简短的示例 用于将列表数组中的值绑定到 c net 中的列表框 这取决于您的列表数组的情况 让我们从一个简单的示例开始 List
  • 是否可以通过引用以基类作为参数的函数来传递派生类

    假设我们有一个抽象基类IBase使用纯虚方法 接口 然后我们推导出CFoo CFoo2来自基类 我们有一个知道如何使用 IBase 的函数 Foo IBase input 这些情况下通常的场景是这样的 IBase ptr static ca
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • Docker 不遵循构建目录中的符号链接

    我正在对一个应用程序进行 Docker 化 其中涉及通过 Clang 将二进制文件与其他 C 文件链接 我们维护二进制文件的符号链接版本 因为它们在整个代码库中使用 我的 Docker 构建目录包含整个代码库 包括源文件以及这些源文件的符号
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • 我可以在类变量中添加没有指定值的 PHP 数组键吗?

    我目前正在努力通过IBM 关于 CakePHP 的教程 http www 128 ibm com developerworks edu os dw os php cake1 html 有一次我遇到了这段代码
  • 为什么 C++20 范围不只提供管道语法?

    我知道这个问题听起来很奇怪 所以这里有一些背景信息 最近 我很失望地了解到 C 20 范围内的映射缩减并不像人们所期望的那样工作 即 const double val data transform accumulate 不起作用 你必须这样
  • PHP - 递归搜索数组中的键和子键,成功时返回键['subkey]

    因此 我编写了一个函数 该函数可以在数组中深入搜索两个级别以查找键和子键对 基本上是在寻找key subkey 如果找到 则返回key subkey 我正在寻找一种以真正递归的方式执行此操作的方法 并根据需要进行尽可能多的深度搜索 直到到达
  • 如何在 C 预处理器中可靠地检测 Mac OS X、iOS、Linux、Windows? [复制]

    这个问题在这里已经有答案了 如果有一些跨平台 C C 代码需要在 Mac OS X iOS Linux Windows 上编译 我如何在预处理器过程中可靠地检测到它们 大多数编译器都使用预定义的宏 您可以找到列表here http sour
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 来自资源中 ImageSource 的 System.Drawing.Image

    我的问题与这个非常相似 wpf图像资源以及运行时在wpf控件中更改图像 https stackoverflow com questions 940592 wpf image resources and changing image in w
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • C++ 项目编译为静态库,编译为动态库失败(链接器错误)。为什么?

    我有一个 VS2008 本机 C 项目 我希望将其编译为 DLL 它仅引用一个外部库 log4cplus lib 并使用其功能 当然也使用 log4cplus 的 h 文件 当我尝试将我的项目编译为静态库时 它成功了 当我尝试作为 DLL
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • HttpClient 响应未刷新

    我正在使用 HttpClient 与 Web 服务进行通信以进行发送 接收 JSON 格式的响应 但我在接收数据时遇到一些问题 我每 5 分钟调用一次 Web 服务 使用 HttpClient 刷新 Windows Phone 上的内容 但
  • 有没有好的带有 TaskExecutor 的 Spring 线程示例? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我试图了解如何在使用 Spring 进行事务管理的 Java 应用程序中实现线程 我在中找到了 Tas
  • 在 C# winforms 的控件内水平和垂直对齐动态添加的控件

    我有这个程序 可以动态添加引用数据库中总统号码的图片框 如何将它们放入组框内并对齐组框内的图片框 如果图片框很多 则组框应该拉伸 我现在有这个代码 private void Form1 Load object sender EventArg
  • Scala SBT 和 JNI 库

    我正在编写一个简单的应用程序Scala通过以下方式使用 leveldb 数据库leveldbjni图书馆 我的build sbt文件看起来像这样 name Whatever version 1 0 scalaVersion 2 10 2 l
  • C# 使用 HttpWebRequest 在 POST 中转义加号 (+)

    我在发送密码字段中包含 等字符的 POST 数据时遇到问题 string postData String Format username 0 password 1 anyname 13Gt2 我正在使用 HttpWebRequest 和网络
  • 如何防止文件重定向到 VirtualStore 来读/写文件?

    我正在使用 C 和 net 2 0 我将程序数据保存在以下文件中 C ProgramData MyProgramName fileName xml 安装并运行我的应用程序一次后 我将其卸载 在卸载过程中 我从 程序数据 中删除了所有文件 然
  • 如何在Android中动态添加按钮?

    如何在Android中动态添加按钮 Button myButton new Button this myButton setText Push Me LinearLayout ll LinearLayout findViewById R i
  • 使用 ASP.NET 发送邮件

    我使用标准的 web config mailSettings 作为我的 ASP NET 电子邮件的骨干 然而 我发现它的能力越来越有限 例如 我想从许多不同的用户帐户 支持 销售 管理等 发送电子邮件 但 mailSettings 似乎不支
  • 如何检测 JSF 应用程序中的客户端区域设置?

    我该如何使用ServletRequest getLocale 在 JSF 应用程序中 当Servlet我的代码中不存在并且由 JSF 实现提供 我正在尝试使用ServletContextListener 但是有可能达到ServletRequ
  • 使轮子在IE中旋转

    我有以下使用 JS 和 CSS 旋转轮子的代码 var prefix function if document body style MozTransform undefined return MozTransform else if do
  • Angular:使用 @ContentChildren 让子组件进入另一个组件

    我在 Angular 6 中创建了一个自定义轮播组件 简单用法如下
  • JMenuItems 在 JLayeredPane 中的较高组件上绘制

    我在 JLayeredPane 的一层上的 JPanel 中有一组 JMenuItem 并在更高层的 JPanel 中绘制了一个模拟光标 当菜单项重新绘制时 它们会在模拟光标上绘制 不会触发光标层的重新绘制 有趣的是 如果我用 JButto
  • 如何在 Angular-4 中的 md-progress-spinner 中设置文本

    在 Angular 4 中 我像这样设置进度旋转器
  • 重复的 AssemblyVersion 属性

    我有一个项目在编译时生成以下错误 错误 CS0579 重复的 AssemblyVersion 属性 我已经检查过文件AssemblyInfo cs看起来那里没有重复 I found MSDN 上的这篇文章 http social msdn
  • ListView onClick 事件不会因链接的电子邮件地址而触发

    我有一个直接的 ListView 带有 ListAdapter 和列表的自定义 onItemClick 方法 我的 ListView 项目可单击以执行其他功能 但是 我的一些 ListView 元素包含一个电子邮件地址should也可以点击
  • 如何读取 Google 表格中单元格的颜色

    我正在使用 Python Google Sheets API 并且我想读取单个单元格的颜色 我已阅读文档 但我只能找到有关如何从单元格检索文本的信息 而不是颜色格式的信息 您可以使用方法 电子表格 get https developers
  • 终端中的 Visual Studio Code Java 路径

    我刚刚开始使用 Visual Studio Code 并用 Java 创建了一个简单的 Hello World 程序 它打印Hello World就像它应该的那样 但我也得到了一些路径 例如 usr lib jvm java 11 open
  • R 中有没有快速替换列值的方法?

    假设我们有一个包含数值的数据框 如下所示 Temperature Height 32 157 31 159 33 139 我想更换Height价值观与pic 00001 pic 00002等等 最终结果是 Temperature Heigh
  • Java:getTimeZone不返回默认值

    我有以下指示 TimeZone zone TimeZone getTimeZone Asia Toyo 显然 它应该返回 null 但它会返回默认时区 这不是我的情况所需的行为 来自 Java 文档 返回指定的TimeZone 或 GMT
  • 为什么超过44个字符时打印随机符号

    我正在从 C 编程 现代方法 一书中学习 C 现在我正在进行有关数组的练习 练习之一是编写一个过滤器 以不同的方式打印输入消息 到目前为止 参见下面的代码 一切正常 直到字符数超过 44 然后它打印随机符号 如果字符数低于 44 则一切正常