atoi怎么了?

时间:2018-12-11 19:28:51

标签: c

我正在尝试编写一个程序,该程序读取文件并汇总所有介于0到9之间的数字,以便它可以将数字6识别为6,将数字12识别为1和2等。这是代码,通常汇总从0到9的数字,但以欺骗性方式汇总类似12的数字。例如,我给atoi函数指针指向1,并且atoi返回数字12而不是1,然后返回2,因此该数字之和为用14代替3.不知道为什么会发生!感谢大家提供富有成效的解决方案。

void sumNumbers(FILE *INCOME_stream)
{

  char defaultNumbers[]={'0','1','2','3','4','5','6','7','8','9'};
  char* defNum_ptr=defaultNumbers;
  char stream_string[maxLength];
  char* stream_string_ptr=stream_string;
  while(fgets(stream_string_ptr,maxLength,INCOME_stream)!=NULL)
  {  int numb=0;

   int stringLength=strlen(stream_string_ptr);
   for(int z=0;z<stringLength;z++)
   {
     for(int h=0;h<sizeof(defaultNumbers);h++)
     {
       if(*(stream_string_ptr+z)==*(defNum_ptr+h))
       {
         numb+=atoi(stream_string_ptr+z);

     }
     }
   }
 printf("sum=%d ",numb);
 } 

1 个答案:

答案 0 :(得分:0)

请记住,数组已经是指针,这是我的建议:
使用strtol扫描字符串,因为endptr功能可以完美地实现此目的

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

#define maxLength 20

void sumNumbers(FILE *INCOME_stream)
{
    char stream_string[maxLength];
    while(fgets(stream_string, maxLength, INCOME_stream) != NULL)
    {
        int numb = 0;
        int app;
        int stringLength = strlen(stream_string);

        char *endptr = stream_string;
        while( endptr - stream_string < stringLength - 1)
        {
            app = strtol( endptr, &endptr, 10);
            if( app >=0 && app < 10)
                numb += app;
        }

        printf("sum=%d ", numb);
    }
}

int main()
{
    sumNumbers( stdin);

    return 0;
}