c - 阿托到底怎么了?

标签 c

我正在尝试编写一个程序来读取文件并汇总从 0 到 9 的所有数字,以便它可以将数字 6 识别为 6,将数字 12 识别为 1 和 2 或类似的东西。下面的代码通常总结从 0 到 9 的数字,但有效地总结像 12 这样的数字。例如,我给出指向 1 的 atoi 函数指针,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);
 } 

最佳答案

请记住数组已经是指针,这就是我的建议:
使用 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;
}

关于c - 阿托到底怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53731063/

相关文章:

c - 在 C 中使用 scanf 接受用户提供的尽可能多的输入

c++ - 任何线程不安全的 mallocs?

c - 有界数值积分

c - 在我的 makefile 中设置我的 LD_LIBRARY_PATH 有问题

c - "null pointer"尝试操作字符串时出错

c - 不使用 malloc 重复不同的字符串模式

c - 我的程序出现段错误

c - INT32_MIN/-1 有什么问题?

C - MSVS 2013 "C2374: ' 名称': redefinition, 多重初始化”- 为什么?

c++ - C/C++中的 "safe"和 "unsafe"代码是什么?