【问题标题】:Converting a String to number and Back to String将字符串转换为数字并返回字符串
【发布时间】:2010-12-24 06:54:05
【问题描述】:

我有一个字符串,例如 "23:0",它是一个小时格式。例如,我需要将其转换为 int,以便可以添加时间。我有一个字符串 "23:0" 我需要添加 6 个小时,这将是 "6:0" 然后给我 "5:0",然后将其转换回字符串。

任何想法将不胜感激:)


当我编写我的函数时,我收到一个错误“无法在初始化中将'字符串转换为 char*'”我的函数如下所示:

int convert(String x){
    char *str = x;
    int hour; int minute;
    sscanf(str, "%d:%d", &hour, &minute);
    return hour;
}
convert(time) //time is a String for example 23:0

【问题讨论】:

  • 一条评论数英里下来说 '哦,我打错了:我真的有“23:0”'。 (a) 编辑问题,并且 (b) 在这种情况下,如果您在 POSIX 机器上,您可以/应该调查 strptime() 将字符串转换为时间,strftime() 将时间转换为字符串。然而,这可能只是几个小时和几分钟的过度杀伤力。

标签: c string int


【解决方案1】:

由于字符串采用特定格式([小时]:[分钟]),您可以使用sscanf() 来扫描字符串。由于字符串是预期的格式,这将是最容易做到的。否则,您将使用其他人描述的其他方法。

char *str = "23:0";
int hour, min;
sscanf(str, "%d:%d", &hour, &min);
/* hour = 23
   min  = 0
*/

之后,您可以进行所需的数学运算并将结果返回到缓冲区。

char buf[100];
hour = (hour + 6) % 24;
snprintf(buf, 100, "%d:%d", hour, min);

【讨论】:

  • 问题是“23.0”而不是“23:0”。此外,23+6 = 5(模 24)。
  • @Jonathan:根据圣地亚哥答案中的评论,它应该是"23:0"。所以我会继续这样做。至于添加,我修复了它,但愚蠢的草稿没有保存并且丢失了我的更改......很容易修复。
  • 当我编写我的函数时,我收到一个错误“无法在初始化中将'字符串转换为 char*'”我的函数看起来像这样。代码: int convert(String x){ char *str = x;小时;整数分钟; sscanf(str, "%d:%d", &hour, &minute);回程时间; } convert(time) //time 是一个字符串,例如 23:0
  • @user:在 C 中,没有真正的“字符串”类型,所以它一定是您定义的类型。它是如何定义的? ps,将您提出的所有新代码作为编辑放入您的上述问题中。发表评论时很难阅读,您不应将此信息添加为“答案”。
  • 我将 feedtime 定义为一个字符串,我的函数采用该字符串并尝试 char *str = x 这给了我错误。
【解决方案2】:

标准库中有用于这些简单任务的简单函数。查找atoi()atof() 进行字符串到数字的转换,查找sprintf() 进行数字到字符串的转换。

编辑:示例。 代码:

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

int main() {

 char string[10];
 int n1, n2, result;

 n1 = atoi("23");
 n2 = 6;

 result = (n1 + n2) % 24;

 sprintf(string, "%d", result);
 printf("Result: %s\n", string);

 return 0;
}

标准输出:

Result: 5

干杯!

【讨论】:

  • 我才意识到我打错字了。我的字符串不是 23.0 而是 23:0。有任何想法吗?对于转换它们,我不相信有一个功能,因为它不是一个真正的数字......
【解决方案3】:

听起来您需要同时完成几件事情(尽管这听起来确实像是一项家庭作业)。最基本的例子是:

char *x = "23.0";
char *y = "6.0";
float result = atof(x) + atof(y);
float result_24h = result % 24; // Modulo to get remainer only
char result_str[32]; // bad bad form, but good enough for this example
sprintf(result_str,"%f",result_24h);

至少有一些类似的东西,从我的脑海中写下来,所以提前为任何拼写错误/语法错误道歉;

【讨论】:

  • strtod()strtof() 通常优于 atof(),因为后者在 *nix 系统上通常被称为“已弃用”(尽管有 C 标准),并且因为前者的功能在无法解析以及溢出/下溢时具有可预测的行为。
猜你喜欢
  • 2014-06-11
  • 2012-10-27
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多