【问题标题】:How can I parse text input and convert strings to integers?如何解析文本输入并将字符串转换为整数?
【发布时间】:2011-11-01 09:08:06
【问题描述】:

我有一个文件输入,其中有以下数据。

1 1Apple 2Orange 10Kiwi
2 30Apple 4Orange 1Kiwi

等等。我必须从文件中读取这些数据并对其进行处理,但我不知道如何检索数据。我想将 1(of 1 apple) 存储为整数,然后将 Apple 存储为字符串。 我想把整个 1Apple 作为一个字符串来读。然后用 stoi 函数做一些事情。

或者我可以逐个字符地读取整个内容,然后如果该字符的 ascii 值位于 b/w 48 到 57 之间,那么我会将其组合为整数并将其余部分保存为字符串?我该做哪一个?另外我如何检查char的ASCII值是什么。 (我应该将char转换为int然后比较,还是有任何内置函数?)

【问题讨论】:

  • 这是你学校的问题吗?您一直在发布此类问题,并且 smtimes 立即将其删除..
  • 如果可以更改文件格式,请使用字符分隔计数和水果。
  • 我相信我们不介意回答这些问题,但你应该尝试自己做,从长远来看它会对你有所帮助。开始发布代码并展示你写了什么,然后开始询问什么你能改进一下吗

标签: c file-io


【解决方案1】:

当且仅当您的输入模式不会改变时,如何使用fscanf() 函数。否则,您可能应该使用 fgets() 并执行检查,如果您想按照您的建议将数字与字符串分开。

【讨论】:

  • -1 用于建议fscanf。使用*scanf 编写一个在格式错误的输入上表现正确的解析器几乎是不可能的。
  • @Zack:你是否错过了“且仅当”部分?
  • 不,尽管我可能误解了它。我以为米兰的意思是未来数据的格式不会改变,但*scanf只有在您不必担心数据中的错误时才可靠,这是一个更强的约束。
【解决方案2】:

使用标准 C 库工具有一种简单的正确方法,一种更困难的正确方法,还有很多错误的方法。这是简单正确的方法:

  1. 使用fgets 将整行读入char[] 缓冲区。
  2. 使用strtolstrtoul 从此行中提取数字。

理解为什么不应该使用看起来更简单的替代方案(*scanfatoi)非常重要。一开始你可能会写更少的代码,但是一旦你开始思考如何处理哪怕是轻微格式错误的输入,你就会发现你应该使用strtol

“比较困难的正确方法”是使用lexyacc。它们要复杂得多,但也更强大。你不应该需要它们来解决这个问题。

【讨论】:

  • atoi 的问题是它没有错误检查。 *scanf 的问题更加微妙。在大多数情况下都可以(例如,如果您尝试将 "hello" 解释为数字,它不会窒息),但它在数字溢出时的行为是未定义的。
  • 你从哪里得知scanf UB 溢出?我知道atoi 确实如此,但是scanf 在溢出时应该表现得像strtol 等,除非我记得非常错误(这是有可能的,因为我通常不使用scanf :-)。
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2012-11-04
  • 2017-03-31
相关资源
最近更新 更多