-1

从昨天晚上开始,我一直在努力解决 atoi 函数的这个问题,但没有逃脱。我创建了一个程序,其中两个功能是: 1- 查找编号。自操作系统更新以来的天数。2-找到号码。自防病毒软件更新以来的天数。现在经过大量循环后,我发现了 mm/dd/yy 格式的两个日期并写在一个文件中。目前我只处理防病毒日期(我在将十六进制值转换为十进制后得到)并将其存储在一个新文件中。例如,将日期设为:07/17/2013。只有这个日期被写入文件。文件中的十六进制数据(通过十六进制工作室打开文件后)为:

    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 的方法。将单个日、月、年转换为整数值后,我必须找到一个日期的总值并将其与当前日期进行比较并找出差异。所以,请提供一些解决方案。

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 小时后上线。谢谢...

4

4 回答 4

1

它“行为不规律”的原因是因为您的char数组都不是 NUL 终止的。改变:

i=0;

至:

amon[i] = '\0'; i = 0;

等应该修复它,虽然你仍然不会有任何边界检查。

于 2013-09-01T18:39:31.993 回答
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" );
}
于 2013-09-01T18:46:48.890 回答
1

尝试将for循环替换为

fscanf(fp_av_dt, "%d/%d/%d", &iday1, &imon1, &iyr1);

返回值应为 3,表示已读取 3 个值。

cf scanf(3)

于 2013-09-01T18:23:36.503 回答
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 小时里一直在旋转。无论如何,谢谢大家。

于 2013-09-01T19:03:22.577 回答