Как преобразовать массив символов в целое число

У меня есть массив из 1 и 0, который сжат таким образом, что когда число 1 больше 10, он пишет +n+, когда n в числе 1, а когда число 0 больше 10, он пишет -n - когда n в числе 0, иначе пишет их как есть.

Теперь проблема в том, что мне нужно распаковать массив, чтобы записать его обратно в файл. Но я не могу найти способ преобразовать количество нулей или единиц в целое число. Он продолжает выдавать мне ошибку, в которой говорится об инициализации аргумента 1 «int atoi (const char *) и еще одного в той же строке, в котором говорится о недопустимом преобразовании из «char» в «const char *». Я работаю в Linux. Вот кусок моего кода

else if(str[i]=='+')
{
n=atoi(str[i+1]);
for(int j=0;j<n;j++)    
{
    strcat(temp,"1");
    i=i+n-1;

}           
}

person Saad Rehman    schedule 30.03.2013    source источник
comment
atoi() устарела. Вместо этого рассмотрите возможность использования strtol().   -  person Randy Howard    schedule 30.03.2013
comment
atoi не устарел. Если вам нужно целое число и вы уверены, что работаете со строкой, оканчивающейся нулем, нет причин не использовать atoi.   -  person Cairnarvon    schedule 30.03.2013


Ответы (1)


Это алгоритм "расширения" - никогда не используйте его в продакшене - например, там нет проверки ошибок, так что это небезопасно. Это быстрый пример.

char *decode(char *q)
{
   char *all=NULL;
   long i=0;
   int n='0';
   char *p;
   if(*q== '+')
     n='1';
   ++q;
   i=strtol(q, NULL, 10);
   all=calloc( i + 1, 1);
   for(p=all; i; i--)
      *p++=n;

   return all;
}

char *decompress(char *dest, char *str)
{
    char *p=str;
    char *q=dest;
    for(; *p; p++)
    {
       if( isdigit((int)*p) )
       {
          *q++=*p;
          *q=0x0;
       }
       else  // - or +
       {
          char *tmp=decode(p);
          strcpy(q, tmp);   
          q=strchr(q, '\0');
          free(tmp);         
          p=strchr(p+1, *p);  // next 
       }
    }
    return dest;
}
person jim mcnamara    schedule 30.03.2013