C 由于特殊字符,atoi()未转换整个字符串

C 由于特殊字符,atoi()未转换整个字符串,c,C,我的.txt文件中有数据,其中包含员工的不同时间输入和超时。例如,10:20,但我最初设计的结构使其数据类型为字符数组或字符串。因为我将在另一个函数中使用时间值,所以我必须使用atoi()函数将它们转换为整数值。问题是,每个时间值中都有一个冒号:。是否可以使用atoi()将字符串10:20转换为整数,以便在将来的函数中使用它?atoi()的使用是否允许进行拆分或排序,以便将时间值从字符串转换为int 我试过了 char time[10] = "10:20"; int val

我的.txt文件中有数据,其中包含员工的不同时间输入和超时。例如,
10:20
,但我最初设计的结构使其数据类型为字符数组或字符串。因为我将在另一个函数中使用时间值,所以我必须使用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作为结果,但是整数,因为我将使用关系运算符。

不清楚您实际想要什么,但可能类似于:

#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;
}
#包括
#包括
int
主(内部argc,字符**argv)
{
char*time=argc>1?argv[1]:“10:20”;
int d;
char*e;
d=标准时间(时间,&e,10);
如果(*e==':'){
d*=100;
d+=strtol(e+1和e,10);
}
如果(*e!='\0'){
fprintf(stderr,“无效输入”);
返回1;
}
printf(“字符串val=%s,int值=%d\n”,时间,d);
返回0;
}

这将为字符串“10:20”生成
d=1020
。我一点也不清楚您想要生成什么整数,但这似乎就是您想要的。

您也可以使用
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);
}
#包括
int main(){
字符常量*time=“10:20”;
int h,m;
如果(sscanf(时间,%d:%d,&h,&m)!=2)
返回1;
printf(“字符串val=%s,int值=%d\n”,时间,h*100+m);
}

“我必须使用atio()函数将它们转换为整数值”。不,你没有。事实上,您永远不应该使用
atoi
,因为它会在某些输入上产生未定义的行为。使用
strtol
@Nic:当
time==“10:20”
时,您希望
val
的内容是什么?您希望使用什么整数来表示字符串“10:20”?您想将其转换为午夜后几分钟、午夜后几秒、包含日期的纪元时间还是其他时间?@williampersell问题仍然存在,无论我是否使用strtol。我的10:20字符串仅在转换后变为10。
strtol
将在
10
之后告诉您字符的地址。检查这是否为
:”
,转到下一个字符,然后使用第二次调用
strtol
转换
20
。或者,如果可以修改字符串,请使用
strtok
将其拆分为由
分隔的标记。谢谢。这对我有用。同时,mediocrevegetable1的解决方案在使用atoi()时也能起作用。@Niic必须非常小心
atoi
。90年代中期以后编写的任何代码都不应该使用它。