从昨天晚上起,我一直在努力解决这个atoi功能问题,但没有逃脱。我创建了一个程序,其中有两个函数:1-找不到。操作系统更新后的几天2-找不到。自防病毒软件更新以来的几天 经过大量的循环后,我发现了mm / dd / yy格式的两个日期,并在一个文件中写入。目前我只处理防病毒日期(我将十六进制值转换为十进制后得到)并将其存储在一个新文件中。例如,将日期设为:2013年7月17日。只有这个日期写在文件中。文件中的十六进制数据(通过十六进制研讨会打开文件后)是:
HEX VALUE --------------------------DECIMAL VALUE
37 2F 31 37 2F 32 30 31 33 0D 0A --- 7/17/2013..
现在我运行3个循环,以便在单独的char变量中获得7,17,2013。但是当我使用atoi,7& 17变为0但2013年仍然是2013.我完成了90%项目的剩余部分&坚持到最后一块。 文件的字符编码无法更改,因为我必须在域计算机上实现整个程序,&我找不到任何与UTF合作的方法。将个别日,月,年转换为整数值后,我必须找到日期的toatl值并将其与当前日期&进行比较。找到差异。所以,PLZ提供了一些解决方案。
int main(void)
{
FILE *fp_av_dt;
int ch_av,n=0,n1=0,n2=0,i=0,iday1=0,imon1=0,iyr1=0;
int mon_val1=0,arr_days_values_av=0;
char dt_av[11],amon1[3],aday1[3],ayr1[5];
fp_av_dt=fopen("c:\\windows\\web\\wallpaper\\av_dt.txt","r");
while((ch_av=fgetc(fp_av_dt))!='\n')
{
if(isalnum(ch_av) | ch_av=='/' | ch_av=='\n')
/* leave any other char other than '/','\n' or any digit */
{
dt_av[n]=ch_av;
//printf("%c",dt_av[n]);
//store chars in dt_av array
n++;
}
}
printf("\n");
for(n=0;dt_av[n]!='/';n++) /* Loop & wait till '/' comes */
{
amon1[i]=dt_av[n]; /* store elements in month's array */
//printf("%c",amon1[i]);
i++;
}
i=0;
for(n1=(n+1);dt_av[n1]!='/';n1++) /*Loop & wait till next '/' comes */
{
aday1[i]=dt_av[n1]; store elements in day's array */
//printf("%c",aday1[i]);
i++;
}
i=0;
for(n2=(n1+1);dt_av[n2]!='\n';n2++)
{
ayr1[i]=dt_av[n2]; store elements in year's array */
//printf("%c",ayr1[i]);
i++;
}
i=0;
iday1=atoi(aday1); /* convert array to integer */
printf("%d\n",iday1);
imon1=atoi(amon1);
printf("%d\n",imon1);
iyr1=atoi(ayr1);
printf("%d\n",iyr1);
system("PAUSE");
} /* Uncomment printf lines to see the value of any variable */
这是睡前时间。因此将在10小时后上线。感谢...
答案 0 :(得分:1)
答案 1 :(得分:1)
它“行为不规律”的原因是因为没有任何char
数组被NUL终止。改变:
i=0;
为:
amon[i] = '\0'; i = 0;
等应该修复它,尽管你仍然没有任何边界检查。
答案 2 :(得分:1)
通常保持简单是更好的,所以为什么不先读行
char buffer[16];
fgets( buffer, 16, fp );
然后使用
提取内容int month = 0, day = 0, year = 0;
int args = sscanf( buffer, "%d/%d/%d", &month, &day, &year );
if ( args != 3 )
{
fprintf(stderr, "wrong format\n" );
}
答案 3 :(得分:0)
感谢您提供解决方案并给我一些scanf命令。我找到了出路。这很奇怪但很有效。 当我在完成赋值后将每个char变量的值转换为整数时,它会给出正确的值。到目前为止,我正在将所有变量全部转换(atoi)(即,在所有数组中存储元素之后)。解决方案例如:
for(n=0;dt_av[n]!='/';n++) /* wait till '/' comes */
{
amon1[i]=dt_av[n]; //assign 7 to amon (month) variable
i++;
}
amon1[i+1]='\0'; /* didn't actually make any difference, but still it should be kepy */
i=0; imon1=atoi(amon1);
printf("%d\n",imon1);
我无法理解为什么会发生这种情况。过去24小时让我保持旋转状态。无论如何,感谢所有人。