sscanf 函数更改另一个字符串的内容

2023-12-10

我在读取字符串时遇到问题sscanf。我简化了代码以专注于问题。下面是整个代码中的一个函数,它应该打开一个文件并读取一些内容。但sscanf表现得很奇怪。例如我声明一个名为atm与内容'ATOM'。之前sscanf它将这个字符串打印为ATOM而之后它为空。可能是什么问题呢?我认为这一定是一个分配问题,但我找不到它。我尝试了一些关于其他主题的建议,例如替换%s与其他事情,但它没有帮助。

 void Get (struct protein p, int mode, int type) 
 {
   FILE *fd; //input file
   char name[100]="1CMA"; //array for input file name
   char string[600]; //the array where each line of the data file is stored when reading
   char atm[100]="ATOM";
   char begin[4];
   int index1 =0;

   fd = fopen(name, "r"); // open the input file

   if(fd==NULL) {
     printf("Error: can't open file.\n");
     return 1;
   }    

   if( type==0 ) { //pdb file type
     if( mode==0 ) { 
       while( fgets(string, 600, fd)!=NULL ) {
         printf("1 %s\n",atm);
         sscanf (string, "%4s", begin );
         printf("2 %s \n",atm);
       }
     }   
   }
   fclose(fd);
   free(fd);
   free(name);
 }

字符串begin不够大,无法容纳四个字符sscanf会读and its \0终结者。如果\0被写入atm(取决于字符串在内存中的位置),atm将被修改。来自sscanf 联机帮助页, 有关s指示:

s    匹配一系列非空白字符; next 指针必须是指向字符数组的指针,该数组的长度足以容纳输入序列和自动添加的终止空字节 ('\0')。输入字符串在空白处或最大字段宽度处停止,以先发生者为准。

我能够在我的机器上重现这种行为,尽管字符串在内存中的确切位置有点不同。不过,通过打印字符串的地址,很容易准确地弄清楚发生了什么。这是一个最小的例子:

#include<stdio.h>

int main() { 
  char begin[2];
  char atm[100]="ATOM";

  printf("begin:    %p\n", begin);
  printf("begin+16: %p\n", begin+16);
  printf("atom:     %p\n", atm);
  printf("1 %s\n",atm);
  sscanf("AAAABBBBCCCCDDDD", "%16s", begin);
  printf("2 %s \n",atm);
  return 0;
}

这会产生输出:

$ ./a.out 
begin:    0x7fffffffe120
begin+16: 0x7fffffffe130
atom:     0x7fffffffe130
1 ATOM
2  

我打印了指针的值来计算出需要多大的字符串才能溢出atm。因为(在我的机器上)atom开始于begin+16,读入十六个字符begin将空终止符放在begin+16,这是第一个字符atm,所以现在atm长度为 0。

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

sscanf 函数更改另一个字符串的内容 的相关文章

  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 将名称字符串编码为唯一的数字

    我有一大堆名字 数以百万计 他们每个人都有一个名字 一个可选的中间名和一个姓氏 我需要将这些名称编码为唯一代表这些名称的数字 编码应该是一对一的 即一个名称只能与一个数字相关联 一个数字只能与一个名称相关联 对此进行编码的明智方法是什么 我
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • Google AdWords 转换服务问题 - 异步转换代码

    我从未在网站上实施过 Google Adwords 因此 如果我的 行话 有误 请随时纠正我 我正在开发一个网站 该网站有一个 Google AdWord 广告系列的登录页面 此页面上有一个表单 处理后会将您带到另一个页面并显示 感谢您的请
  • Web api 2 Web 服务中的 Dispose 方法

    我正在使用 Web api 2 Web 服务编写 MVC 5 互联网应用程序 我是否需要 Web 服务中的 DbContext 类的 dispose 方法 默认情况下它不存在 实际上 System Web Http ApiControlle
  • JMS Serializer:如何限制对象图的序列化深度

    也许这只是我对此注释的误解 但它似乎没有按预期工作 我有以下对象图 User gt Company gt Users gt Groups gt Permissions 正如你所看到的 会有一些递归 JMS 很好地处理了这个问题 它不序列化其
  • 使用 CSharpCodeProvider 允许用户创建函数

    我有一个现有的 asp net c 应用程序 我需要为用户提供一种创建灵活规则的方法 以计算给定雇用日期和注册日期的生效日期 可能使用的规则的一些示例 雇用日期或注册日期中较晚的一个 雇用日期 90 天 入学日期后的第一个月 如果注册日期在
  • 无扩展名 URL 尾部斜杠重定向

    我在几个 Dreamhost 域上测试了下面的代码 它可以工作 但 2012 年左右添加的新域除外 RewriteEngine on unless directory remove trailing slash RewriteCond RE
  • asp.net jquery ajax json:交换数据的简单示例

    在两个回复帖子的帮助下解决了问题 见下文 我希望能帮助您获得在浏览器 使用 JavaScript JQuery 和 ASP NET 使用 Visual Studio 2010 之间交换数据 JSON 数据的简单示例 当我单击按钮时 将执行以
  • 在 C 和 C++ 中访问数组超出限制 [重复]

    这个问题在这里已经有答案了 int data 8 data 9 1 C 标准对此有何规定 这是未定义的行为吗 至少C编译器 gcc std c99 pedantic W Wall 没有对此说什么 访问数组边界之外是未定义的行为 从c99标准
  • 获取 UIBezierPath Stroke 的轮廓路径

    我有一个UIBezierPath笔划 现在我想获取笔划的轮廓路径 不是笔划的路径本身 有什么方法可以得到吗 或者至少NSLog the UIBezierPath笔画的轮廓路径 谢谢 您可以使用CGPathCreateCopyByStroki
  • 如何制作一个只能订阅一次的轻量级“Replay”算子?

    在不同的场合我都希望有一个 RxReplay操作符缓冲传入的通知 在第一次订阅时同步重放其缓冲区 然后停止缓冲 这款轻量级Replay运营商应该只能为一名订户提供服务 可以找到此类运算符的一个用例here 在第一次订阅后继续缓冲只是浪费资源
  • Delphi中的串口同步

    我仍然遇到 TComPort 组件的问题 但这一次不是组件本身 而是它背后的逻辑 我有一个设备女巫通过串行端口发送一些 ascii 字符串 我需要解析这些字符串 问题是计算机反应非常快 所以在事件 char 中它只捕获字符串的一部分 字符串
  • 是否可以将 64 位 dll 加载到 32 位进程中?

    是否可以将 64 位 dll 加载到 32 位进程中 一般来说 我知道这不可能发生 然而 也许有一些例外 不可以 64 位进程都无法加载 32 位 DLL 如果您使用的是 64 位操作系统 则可以在 64 位进程中加载 DLL 并通过以下方
  • 如何在单击 CursorAdapter 中的按钮时在列表视图项行中执行更新和删除操作

    在 sqlite 数据库的帮助下 我添加了板球运动员姓名 最后它在列表视图中显示了姓名 我在 CustomCursorAdapter java 中添加了更新和删除按钮 下面我发布了相应的适配器代码 自定义CursorAdapter java
  • @Nullable注解用法

    我看到java中的一些方法声明为 void foo Nullable Object obj 是什么意思 Nullable这里 这是否意味着输入可以是null 如果没有注解 输入仍然可以为null 所以我猜不仅仅是这样 它清楚地表明该方法接受
  • 将点击事件添加到 IOS NSMutableAttributedString

    我有一个 NSMutableAttributedString 例如 鲍勃喜欢你的照片 我想知道是否可以向 Bob 和 图片 添加两个不同的点击事件 理想情况下 点击 Bob 将呈现一个带有 Bob 个人资料的新视图控制器 点击 图片 将呈现
  • JavaScript 中如何检查对象是否具有任何属性?

    假设我声明 var ad 如何检查该对象是否包含任何用户定义的属性 您可以使用内置的Object keys方法获取对象上的键列表并测试其长度 var x some code where value of x changes and than
  • 当开发名称以数字开头时,Android studio中的包名称?

    我想以我公司的名义创建应用程序 Android Studio 建议使用您的域名 例如 域名 example com 应用程序 我的应用程序 给出 com example myApp 的包名称 没关系 但我的公司名称以数字开头 Android
  • 如何在 Spotfire 中显示前 10 个列值

    我需要使用 Spotfire 显示前 10 个值 我用谷歌搜索了很多 但找不到最好的解决方案 我按照这个教程进行操作 创建动态前十图表但没有找到成功 我怎样才能做到这一点 如何通过前 10 个值限制可视化 有两种方法可以做到这一点 我将列出
  • django-postman扩展了一个不存在的base.html

    我已经安装并配置了django postman基于文档 in urls py在我的项目的根目录中 r messages include postman urls 在设置 py中 INSTALLED APPS django contrib a
  • php - move_uploaded_file - 为什么它很重要?

    我无法想象为什么我应该使用这个函数而不是简单的重命名 手册写道 移动上传文件 该函数检查以确保 filename 指定的文件 是一个有效的上传文件 意味着它是通过 PHP 的 HTTP 上传的 POST 上传机制 如果文件有效 它将被移动到
  • sscanf 函数更改另一个字符串的内容

    我在读取字符串时遇到问题sscanf 我简化了代码以专注于问题 下面是整个代码中的一个函数 它应该打开一个文件并读取一些内容 但sscanf表现得很奇怪 例如我声明一个名为atm与内容 ATOM 之前sscanf它将这个字符串打印为ATOM