【问题标题】:atoi() not converting whole string because of special characteratoi() 由于特殊字符而不转换整个字符串
【发布时间】:2021-06-09 15:29:25
【问题描述】:

我的 .txt 文件中有数据,其中包含员工的不同时间进出。例如,10:20,但我最初将结构设计为使其数据类型为 char 数组或字符串。由于我将在另一个函数中使用时间值,因此我必须使用 atoi() 函数将它们转换为整数值。问题是,每个时间值中都有一个冒号:。是否可以使用 atoi() 将字符串 10:20 转换为整数,以便在以后的函数中使用它? atoi() 的使用是否允许进行一些拆分或某种排序,以便我可以将我的时间值从字符串转换为 int?

我试过了

char time[10] = "10:20";

int val;

printf("string val = %s, int value = %d", time, atoi(time));

但我的输出只有 string val = 10:20, int value = 10 所以只有: 之前的字符串被读取并转换为字符串。我希望在转换之后,我仍然会得到 10:20 作为结果,但是是整数,因为我将使用关系运算符。

【问题讨论】:

  • “我必须使用 atio() 函数将它们转换为整数值”。不,你没有。事实上,你永远不应该使用atoi,因为它会在某些输入上产生未定义的行为。使用strtol
  • @Nic:当time == "10:20" 时,您希望val 的内容是什么?
  • 你想用什么整数来表示字符串“10:20”?您想将其转换为午夜过后的分钟数、午夜后的秒数、包含日期的纪元时间,还是其他?
  • @WilliamPursell 无论我是否使用 strtol,问题仍然存在。我的 10:20 字符串在转换后才变成 10。
  • strtol 会告诉你10 后面的字符的地址。检查这是否是':',转到下一个字符,然后从那里再次调用strtol 来转换20。或者如果字符串可以修改,使用strtok将其拆分为由:分隔的标记。

标签: c


【解决方案1】:

不清楚你真正想要什么,但可能是这样的:

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

int
main(int argc, char **argv)
{
        char *time = argc > 1 ? argv[1] : "10:20";
        int d;
        char *e;

        d = strtol(time, &e, 10);
        if( *e == ':' ){
                d *= 100;
                d += strtol(e + 1, &e, 10);
        }
        if( *e != '\0' ){
                fprintf(stderr, "invalid input\n");
                return 1;
        }

        printf("string val = %s, int value = %d\n", time, d);
        return 0;
}

这将为字符串“10:20”生成d = 1020。我根本不清楚你想要产生什么整数,但这似乎就是你要找的。​​p>

【讨论】:

  • 谢谢。这对我有用。同时,mediocrevegetable1 的解决方案在使用 atoi() 时也有效。
  • @Niic 要非常警惕atoi。 90 年代中期以后写的代码都不应该使用它。
【解决方案2】:

你也可以使用sscanf:

#include <stdio.h>

int main() {
  char const* time = "10:20";

  int h, m;
  if (sscanf(time, "%d:%d", &h, &m) != 2)
    return 1;

  printf("string val = %s, int value = %d\n", time, h * 100 + m);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2019-02-17
    • 2012-05-01
    相关资源
    最近更新 更多