如果我在 scanf 函数中使用带有字符串的“&”会发生什么?

2023-12-15

我刚刚在博客中看到一些代码。 它使用了

scanf("%s",&T);

但正如我们所知,我们不应该在字符串中使用 & 符号,因为它会自动分配该字符串的首地址。我确实运行了该代码,令人惊讶的是它正在工作,所以我想知道当我使用时会发生什么&在字符串中?

#include <stdio.h>
int main()
{
    char T[2];
    scanf("%s", &T);
    printf("You entered %s\n", T);
}

代码片段的相关部分是:

char T[2];
scanf("%s", &T);

&T是一个指向两个字符数组的指针(char (*)[2])。这不是那种类型scanf需要一个%s说明符:它需要一个指向字符的指针(char *)。所以程序的行为是未定义的。

如您所知,编写此程序的正确方法是

char T[2];
scanf("%s", T);

Since T是一个数组,当它在大多数上下文中使用时,它会“衰减”为指向第一个字符的指针:T相当于&(T[0])其中有类型char *。当您获取数组的地址时,不会发生这种衰减(&T)或其大小(sizeof(T)).

实际上,几乎所有平台都对指向同一地址的所有指针使用相同的表示形式。所以编译器会生成完全相同的代码T and &T。有一些罕见的平台可能会生成不同的代码(我听说过它们,但我无法说出其中一个)。某些平台对“字节指针”和“字指针”使用不同的编码,因为它们的处理器本身寻址字,而不是字节。在这样的平台上,int * and a char *指向同一地址的不同编码。这些类型之间的转换会转换值,但在变量参数列表之类的情况下误用会导致错误的地址。然而,我希望此类平台对 char 数组使用字节地址。还有一些罕见的平台,其中指针不仅编码数据的地址,还编码一些类型或大小信息。然而,在这样的平台上,类型和大小信息必须是相同的:它是一个 2 字节的块,从地址开始T,并且可逐字节寻址。因此,这个特殊的错误不太可能产生任何实际影响。

请注意,如果您首先使用指针而不是数组,情况将完全不同:

char *T; // known to point to an array of two characters
scanf("%s", &T); // bad

Here &T是指向内存中包含字符数组地址的位置的指针。所以scanf将在指针所在的位置写入它读取的字符T存储在内存中,而不是存储在T指着。大多数编译器分析函数的格式字符串,例如printf and scanf所以会发出错误消息。

注意char T[2]只有两个字符的空间,这包括字符串末尾的空字节。所以scanf("%s", T)只有空间可以读取单个字符。如果此时输入包含多个非空白字符,程序将溢出缓冲区。要读取单个字符并使其成为单字符字符串,请使用

char T[2];
scanf("%c", T);
T[1] = 0;

Unlike scanf("%s", T),这会读取任何字符,甚至是空格。要读取有长度限制的字符串,请添加限制%s规格。你永远不应该使用无限制的%s in scanf因为这将读取尽可能多的可用输入,无论内存中有多少空间可以存储该输入。

char T[2];
scanf("%1s", T); // one less than the array size
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果我在 scanf 函数中使用带有字符串的“&”会发生什么? 的相关文章

  • ASP Core HttpClientFactory 模式使用客户端证书

    任何人都知道在使用时如何使用客户端证书HttpClientFactory 在我发现的所有示例中 您需要提供HttpMessageHandler in the HttpClient构造函数 使用时不可用HttpClientFactory se
  • dup2() 和 exec()

    include
  • C# 测试活动的互联网连接。 Ping google.com

    C 2008 我正在使用此代码来测试互联网连接 因为我的应用程序必须登录到网络服务器 但是 如果用户互联网连接失败或电缆被拔出 我必须通知用户 Ping www google com to check if the user has a i
  • binary_log_types.h:没有这样的文件或目录

    我正在编译一个小型 mysql C 项目并且 遇到以下错误 C Program Files x86 MySQL MySQL Server 5 7 include mysql com h 22 30 fatal error binary lo
  • C# 并行与并行线程代码性能

    我一直在测试 System Threading Parallel 与线程的性能 我很惊讶地发现并行比线程花费更长的时间来完成任务 我确信这是由于我对并行的了解有限 我刚刚开始阅读 我想我会分享一些片段 如果有人可以向我指出并行代码比线程代码
  • 在目标 VS 安装时,VSIX 扩展内部使用的 WPF-Log4Net 未输出日志

    当 Log4net 在 VSIX 扩展中使用并安装在另一个目标 VS 上时 它不会记录日志 我有一个 WPF 解决方案 我下载了 log4net dll 添加了 log4net config 并将 复制到输出目录 值设置为 始终复制 log
  • 为什么将 char 传递给函数会改变它在 c 中的值?

    我目前正在关注本作业簿 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于构建操作系统 我的目的是写一个64位内核 我已经在文本模式下加载 内核 代码并
  • 从套接字读取 C HTTP

    我想知道如何判断是否已从套接字接收到所有数据 这是一个简单的网络代理 现在我正在处理请求部分 所以发送的内容应该以 r n r n 结尾 我不知道请求会持续多久 我在这里读过一些帖子 说我应该检查读取函数是否返回 0 但其他人说0只在客户端
  • 我可以在 C++ 中重写非虚函数吗

    我想知道我可以重写 C 中的非虚函数吗 因为我在使用 C 时发现了这个问题override关键字我的代码如下 class A public void say cout lt lt From A n class B public A publ
  • C 中的链表数组:初始化和插入?

    我需要创建一个链表数组 如图所示 这就是我到目前为止所做的 typedef struct Node int data struct Node next Node int main void Node link 5 for int q 0 q
  • C++:LPWSTR 在 cout 中打印为地址

    我有一个类型变量LPTSTR 我打印到std cout with lt lt 在 ANSI 系统中 不知道它是在哪里确定的 它工作得很好 它打印了字符串 现在 在 Unicode 系统中 我得到的是十六进制地址而不是字符串 那么 为什么LP
  • 我可以对(非成员)函数使用部分模板特化吗?

    我试图在 非成员 函数上使用部分模板专业化 但我在语法上遇到了问题 我在 StackOverflow 中搜索了其他部分模板专业化问题 但这些问题涉及类或成员函数模板的部分专业化 作为起点 我有 struct RGBA RGBA uint8
  • 如何在 Visual Studio 2010 Express 中引用 system.drawing?

    我对此有点陌生 我的印象是要绘制我创建的矩形 我需要使用 system drawing graphics 问题是 我收到错误 命名空间 System 中不存在类型或命名空间名称 drawing 您是否缺少程序集引用 当我右键单击解决方案资源
  • 为什么必须通过 this 指针访问模板基类成员?

    如果下面的类不是模板 我可以简单地拥有x in the derived班级 但是 通过下面的代码 我have to use this gt x Why template
  • 使用 _Alignas 进行结构成员对齐

    我想知道以下问题 是新的吗 Alignas结盟 C11 中的说明符适用于结构成员吗 我一直假设这么多 但彻底阅读了 N1570 公开草案似乎表明对齐说明符不能 出现在一个说明符限定符列表 这就是我所期望的 如果得到支持的话 我已经读过几遍语
  • 如何在asp.net core 6中注入IConfiguration

    web api 应用程序中不再有 Startup cs 我们以前可以注入IConfiguration进入那个Startup class public class Startup public Startup IConfiguration c
  • 如何创建和使用类箭头运算符? [复制]

    这个问题在这里已经有答案了 因此 在到处研究之后 我似乎找不到如何创建类箭头运算符 即 class Someclass operator gt 我只需要知道如何使用它并正确使用它 它的输入是什么 它返回什么 我如何正确地声明 原型化它 运算
  • C# 3.0 中自动属性和公共字段的区别

    我无法理解为什么 C 3 0 中存在自动实现的属性语言功能 当你说的时候有什么区别 public string FirstName than public string FirstName get set 因为它们在生成的 IL 代码 和机
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使

随机推荐

  • Python,字符串中字符的具体计数

    我正在尝试计算 python 中字符串出现的次数 我想采用二进制输入 例如 001101 然后计算 1 0 11 00 等的数量 我试图通过使用 count 来实现这一点 但是当我只希望它输出 1 1 和 1 11 时 这会输出有 3 个
  • Python 2.x 可选子解析器 - 错误参数太少

    我一直在尝试设置一个带有两个子解析器的主解析器 以便在单独调用时 主解析器会显示一条帮助消息 def help message print help message import argparse parser argparse Argum
  • C 中二分查找的第一次和最后一次出现

    我试图了解如何修改二进制搜索 使其适用于第一次和最后一次出现 当然我可以在网上找到一些代码 但我试图深入理解 这里是一些基本的非递归二进制搜索我发现 int BinarySearch int array int number of elem
  • 更改快速选择器的悬停颜色

    是否可以通过设置更改快速选择器所选选项的颜色 要保留当前主题并仅更改此颜色 请在设置中找到 工作台 颜色自定义 然后单击 在 settings json 中编辑 然后将以下内容添加到屏幕右侧的用户设置中 workbench colorCus
  • 推荐的c# winform控件包[关闭]

    Closed 这个问题是无关 目前不接受答案 我正在寻找商业 免费推荐的 c winform 控件包 开发快递 我试过了组件一 DevExpress 和Telerik
  • 将 NSString 绘制到 UIImage

    我有一个 NSString 对象 我想将其写入现有的 UIImage 对象 UIImage 对象已经有一些与之关联的图像 我想将字符串写入同一张图像 我如何实现它 编辑 以下是实现编辑 UIImage 并在其上写入文本的基本步骤 从 UII
  • Tomcat 使用 Windows 证书存储进行 SSL

    我使用 Tomcat 9 0 10 并希望使用 Windows 证书存储来保存 SSL 私钥和证书 有这里是另一个线程 这似乎有答案 但是启动 Tomcat 时出现异常 我的 server xml 如下所示
  • 如何捕获Retrofit android中的异常

    我已将类定义如下 我在这里使用了 dagger 和 Retrofit 我正在尝试做什么 我正在努力抓住OfflineException在下面的请求中 如何在主活动中正确捕获它 请求拦截器 java public class RequestI
  • 通过更改 Android 中的应用程序语言来更改默认手机语言?

    有没有办法通过更改应用程序的语言来更改手机的语言 我的意思是 当我更改应用程序的语言时 默认手机语言也会更改 对此有什么想法请在这里分享 提前致谢 我不知道它可以通过编程方式更改 但是在更改应用程序语言后 您也可以要求用户更改设备语言 要求
  • 使用 MySql、PHP 和 ADODB 在准备好的语句中参数化 IN 子句

    我正在编写一些 SQL 并使用 AdoDb 连接到我的数据库并运行查询等 我正在使用参数化查询并遇到了障碍 它们是一种将值数组传递给 AdoDb MySql 中的 in clause 进行参数化的方法 我的问题是 如果我传递一个准备好的字符
  • 在 C/C++ 中编写“指向某物的指针”的好方法

    在 C C 中是否有一种 好 的方法来编写 指向某物的指针 我用来写void foo char str 但有时我发现这很不合逻辑 因为str是 指向 char 的指针 那么附加 应该更合乎逻辑 到类型名称 指针的书写有规则吗 char st
  • VideoView 位于 SurfaceView 之上

    我尝试展示一个VideoView在一个上面SurfaceView 但它不可见 但会对点击做出反应 MediaController 出现并播放声音 该视频似乎是在后面播放的SurfaceView所以我也尝试利用setZOrderMediaOv
  • Facebook 单点登录无法在 Windows 10 设备上运行的 Windows Phone 8.1 应用程序中运行

    我已经提到过this使用 facebook 应用程序实现 facebook 登录的链接 效果很好 从 Facebook 应用程序登录后 它会重定向到我的应用程序 但是当我在 Windows 10 设备上运行此应用程序时 Facebook 应
  • CoreData多对多关系

    CoreData中如何操作多对多关系 例如 我有 2 个实体 食谱和配料 CoreData 像食谱 gt 成分一样链接它们 现在我需要为配方中的每种成分添加属性 计数 我该怎么做 Thanks Core Data 会为您负责对象图一致性维护
  • 未知的服务器标记“ajaxToolkit:HtmlEditorExtender”

    我正在使用 ajaxcontrols 并且所有控件都运行良好但我没有找到任何名为 HtmlEditorExtender 的控件 所以我刚刚在 html 页面中复制了此标签
  • SingleWrite 与 TripleWrite

    我非常清楚何时何地使用 SingleWrite 作为 MQ 中的日志算法是有利的 它有利于高吞吐量 低并发工作负载 当工作负载更加并发时 TripleWrite 的开销就不那么重要了 我不明白并且正在努力寻找任何有关 TripleWrite
  • 应用程序从 Rails 5.2 升级到 6.0 后运行 rspec 时出现 PG::ConnectionBad(连接已关闭)

    我尝试将我的应用程序从 Rails 5 2 升级到 6 0 升级后运行rspec它会引发错误PG ConnectionBad connection is closed 该错误是由表达式引起的ActiveRecord Migration ma
  • 路径依赖类型是子类型吗?

    trait A trait B def foo A this B new B def bar A B foo def baz A this B bar type mismatch found A B required A this B 我说
  • 选择字段中不同的第一个单词

    我希望能够执行选择查询 仅获取字符串中不同的第一个单词 不包括最后一个单词 如果不清楚 这是我想要的下表结果 苹果 iPhone 4S苹果 iPhone 4苹果 iPhone 6 Plus id model 1 Apple iPhone 4
  • 如果我在 scanf 函数中使用带有字符串的“&”会发生什么?

    我刚刚在博客中看到一些代码 它使用了 scanf s T 但正如我们所知 我们不应该在字符串中使用 符号 因为它会自动分配该字符串的首地址 我确实运行了该代码 令人惊讶的是它正在工作 所以我想知道当我使用时会发生什么 在字符串中 inclu