在C中读取字符串

2023-12-04

如果我使用 C gets(),并且我正在从用户那里读取字符串,但我不知道我需要多大的缓冲区,并且输入可能非常大。 有没有办法可以确定用户输入的字符串有多大,然后分配内存然后将其放入变量中?或者至少是一种在不知道输入有多大的情况下接受输入的方法,有可能它不适合我已经分配的缓冲区。


我认为使用一个适当大的中间缓冲区,并将字符串输入其中fgets或通过将字符串长度限制为最大缓冲区大小来实现其他功能。稍后当输入字符串时,。计算字符串长度并分配一个字符串大小的缓冲区并将其复制到新分配的缓冲区中。旧的大缓冲区可以重新用于此类输入。

你可以做:

fgets (buffer, BUFSIZ, stdin);

or

scanf ("%128[^\n]%*c", buffer);

这里你可以指定缓冲区长度 128 字节为%128..并且还包括字符串中的所有空格。

然后计算长度并分配新的缓冲区:

len = strlen (buffer);
string = malloc (sizeof (char) * len + 1);
strcpy (string, buffer);
.
.
.
free (string);

EDIT

这是我解决的一种方法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
  char *buffer[10];  /* temporary buffers 10 nos, or make this dynamically allocated */
  char *main_str;    /* The main string to work with after input */
  int k, i=0, n, retval;

  while (1)
  {
    buffer[i] = malloc (sizeof (char) * 16); /* allocate buffer size 16 */
    scanf ("%15[^\n]%n", buffer[i], &n);     /* input length 15 string + 1 byte for null */
    if (n<16)                                /* Buffer is not filled and end of string reached */
      break;
    n=0;                                     /* reinitialize n=0 for next iteration. to make the process work if the length of the string is exactly the sizeof the buffer */
    i++;
  }
  /* need to fix the while loop so that the buffer array does not overflow and protect it from doing so */

  /* allocate buffer of exact size of the string */
  main_str = malloc (sizeof (char) * 16 * i + strlen (buffer[i]));

  /* copy the segmented string into the main string to be worked with 
   * and free the buffers
   */
  strcpy (main_str, "");
  for (k=0; k<=i; k++)
  {
    strcat (main_str, buffer[k]);
    free (buffer[k]);
  }

  /* work with main string */
  printf ("\n%s", main_str);

  /* free main string */
  free (main_str);

  return 0;
}

您需要修复代码以停止在某些情况下崩溃,但这应该可以回答您的问题。

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

在C中读取字符串 的相关文章

  • 将 System.Drawing.Image 转换为 System.Windows.Media.ImageSource 但没有结果

    我想在我的 WPF 应用程序中将 Image 转换为 ImageSource 我使用正常工作的 Code128 库 已在 WinForms 应用程序中检查 下面的函数返回具有适当大小的 ImageSource 但没有任何内容可见 priva
  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • VBA 中的 VSTO:AddIn.Object 有时不返回任何内容 (null)

    Given VSTO 插件 An override object RequestComAddInAutomationService 它返回一个名为的类的实例Facade在我的场景中 Excel 2007 中的 VBA 宏可访问AddIn O
  • WPF MVVM将DataTable绑定到DataGrid不显示数据

    我有一个简单的控件 其中包含一个 DataGrid 其中 ItemsSource 绑定到 DataTable 当我填充 DataTable 时 我可以看到 DataGrid 中添加了行 但没有显示任何数据 我没有为此 DataGrid 使用
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 无法更新 .mdf 数据库,因为该数据库是只读的(Windows 应用程序)

    我使用 C 创建了一个数据库 Windows 应用程序 我的应用程序在 Windows XP 上成功运行 但在 Vista 或 Windows 7 系统上无法正确执行 我的应用程序显示类似以下内容的消息 无法更新 mdf 数据库 因为该数据
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用
  • 使用 Thread.Sleep() 时,异步编程如何与线程一起工作?

    假设 前言 在之前的问题中 我们注意到Thread Sleep阻塞线程参见 什么时候使用Task Delay 什么时候使用Thread Sleep https stackoverflow com questions 20082221 whe
  • 使用 C 创建立体声正弦波

    我正在尝试用 C 创建立体声正弦 WAV 并且可能有不同的 可能是空白的 左声道和右声道 使用此函数为每个通道生成一个音调 int16 t create tone float frequency float amplitude float
  • C++ 克隆惯用语中协变返回类型的用处?

    通常的克隆习惯使用协变返回类型 struct Base virtual Base clone struct Derived public Base Derived clone 我读过一些内容 大意是协变返回类型是 C 后来添加的 较旧的编译
  • 让 WIX 在项目中包含引用

    我对 WiX 和设置自定义安装程序完全陌生 所以我对问题的主题表示歉意 我有一个内部业务应用程序 日记 它构建并运行良好 因此我按照教程 官方文档添加 WiX 项目并引用日记的 csproj 然后构建并运行这个最基本版本的 WiX 安装程序
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • Yield Return == IEnumerable 和 IEnumerator 吗?

    Is yield return实施的捷径IEnumerable and IEnumerator 是的 您可以在我的书 C in Depth 的第 6 章中找到更多相关信息 幸好第六章是免费提供 http www manning source
  • 更新插入 MongoDB 时如何防止出现“_t”字段?

    我有一个应用程序 它使用 MongoDB 的 C 驱动程序将 Upsert 插入 MongoDB 数据库 当我打电话给Update函数 我无法指定我要更新的类型 然后 t字段插入元素的类型 这是我用来更新插入的代码 collection U
  • 在 C# 中将 ulong 映射到 long ?

    我正在尝试将 ulong 映射到 long 反之亦然 将 uint 映射到 int 反之亦然 如下所示 为了将值保存在具有签名类型的 MS SQL 数据库中仅限整数和大整数 我这样做是因为我必须检查 在数据库中 一个数字 uint ulon
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 组合框由于某种原因被链接

    我有以下代码来填充 3 个组合框 private void PopulateDDLs SqlConnection connection SqlCommand command SqlDataReader reader DataTable dt

随机推荐

  • 在 mac os 上的 nasm 中编译汇编程序

    所以 我写了一些关于asm的指令 并编译它们 nasm f macho test asm 现在 nasm生成obj文件 test o gcc test o 返回下一个错误 ld 警告 忽略文件 test o 文件是为不受支持的文件构建的 不
  • Hibernate 二级缓存不适用于 OneToOne 关联

    我正在尝试启用 Hibernate 二级缓存 但无法避免为一对一关系发出多个查询 我的模型是 Entity Cache usage CacheConcurrencyStrategy READ WRITE public class Busin
  • 具有 SearchView 功能的 Android MultiChoice Spinner

    希望你一切顺利 我遇到了要实施的问题Search功能在MultiChoice Spinner 正如我所实施的多项选择旋转器在那个使用的AlertDialog显示多项选择项 添加过滤器功能有两个选项 Add EditText在 AlertDi
  • 使用 EL 变量调用 EL 函数(如 ${fn:toLowerCase(${Person.name})} )不起作用

    我正在传递一颗豆子 Person到我的jsp页面 我想以小写形式打印他的名字 为此 我调用 jstl 的函数toLowerCase 但这不起作用
  • FireBase 查询。数据快照

    我需要帮助从该 DataSnapshot 结果获取 消息 对象 DataSnapshot key user 4 value JvFuwKX7r7o0ThXc0x8 sender unit owner message fkfkgkgkgkgg
  • 从向量创建一系列向量

    我有一个简单的两个向量数据帧 长度 30 看起来像这样 gt mDF Param1 w IL L 1 AuZgFw 0 5 2 AuZfFw 2 3 AuZgVw 74 3 4 AuZfVw 20 52 5 AuTgIL 80 9 6 Au
  • Java JTextArea 动态列和行编号

    我快速谷歌了一下 似乎找不到一个好的解决方案 主要是因为我不知道如何描述它 本质上 我需要在一个文件中显示任意数量的十六进制字符JTextArea 我想让它们均匀分布 并将字符的位置显示在字符的顶部和左侧 这是我想要实现的一个示例 这是十六
  • C# 在控制器中使用 LINQ 语法生成错误

    大家好 我在此控制器代码的第 11 行出现以下错误 public JsonResult GetChartData IncidentsBySiteStatus string SiteTypeId string searchTextSite s
  • 在 JSON 中查找深层嵌套的键/值

    假设我有一个像这样的 JSON 数组 id 429d30a1 9364 4d9a 92e0 a17e00b3afba children parentid name Expo Demo id f80f1034 9110 4349 93d8 a
  • HTACCESS - 重定向

    我有一些旧文件 homepage html 和 home html 我确信人们已经为它们添加了书签 所以我想将它们重定向到父网址 我已经浏览过谷歌 但他们似乎不符合我的期望 例如 www nicetomeetyou com home htm
  • 基于MetadataType的ASP.Net C#验证模型

    我的团队正在构建 ViewModel 并在 MetadataType 中进行模型验证 我的问题是 我使用的是非 MVC 项目 我可以用它来验证模型吗 如果是 您能举个例子吗 MetadataType typeof PersonMetadat
  • 自动打开侧载任务窗格

    是否可以自动打开处于开发人员模式的插件 根据文档 您指定自动打开的窗格仅在以下情况下才会打开 该加载项已安装在用户的设备上 如果用户这样做 打开文档时未安装加载项 自动打开 功能将不起作用并且该设置将被忽略 如果你也 要求加载项与您需要设置
  • python tkinter:检测触摸板上的水平滚动

    我有一个 大 python tkinter 画布 使用箭头键和 Shift 鼠标滚轮进行导航非常简单 但我也想通过笔记本电脑触摸板上的两根手指来完成此操作 今天我发现它可以识别水平滚动 Ubuntu 16 04 LTS Python 2 x
  • 梯度如何通过 tf.py_func 传递

    这是张量流中的 Faster R CNN 实现 The 提案层 is 实施通过蟒蛇 我很好奇梯度是否可以通过tf py func权重和偏差不断变化所以我认为梯度传递成功 然后我做了一个小测试 import tensorflow as tf
  • gcloud 可以连接,但 gsutil 无法连接

    尝试使用gcloud gsutil从笔记本电脑 gcloud可以连接但是gsutil cannot mylaptop jamiet gcloud projects list head 2 PROJECT ID NAME PROJECT NU
  • 具有安全性和配置文件效率的 MEF 插件

    我有一个具有许多模块 插件的应用程序 我使用带有目录插件的 MEF 来导入它们 每个用户都有一个存储在数据库中的可用模块列表 并且每个用户可以有多个配置文件来控制哪些模块可见 有一个概述区域 显示来自具有 ImportMany typeof
  • 重定向命令行输出以防止错误消息显示在命令窗口中

    我正在测试文件夹是否存在 并且根据它的存在 我想运行不同的命令 DIR MYDIR tmp gt test txt IF ERRORLEVEL 1 echo FOLDER DOES NOT EXIST else echo FOLDER EX
  • ES6 中的映射与对象,何时使用?

    参考 MDN 地图 当键在运行时之前未知时 以及当 所有键都是相同类型 所有值都是相同类型 当存在对单个元素进行操作的逻辑时 请使用对象 问题 在对象上使用映射的适用示例是什么 特别是 什么时候密钥在运行时之前是未知的 var myMap
  • 如何从其他活动调用主活动中的方法?

    我想从其他活动中调用主活动中的公共方法 我怎样才能做到这一点 class MainActivity extends Activity public void myMethod class MyActivity extends Activit
  • 在C中读取字符串

    如果我使用 C gets 并且我正在从用户那里读取字符串 但我不知道我需要多大的缓冲区 并且输入可能非常大 有没有办法可以确定用户输入的字符串有多大 然后分配内存然后将其放入变量中 或者至少是一种在不知道输入有多大的情况下接受输入的方法 有