2017-01-14 2 views
1

Я новичок и мой английский не очень извиняюсь в первую очередь. im пытается суммировать числа в строке (для a14fg5pk145 он возвращает 14 + 5 + 145), и он не работает: «Исключение брошено: нарушение прав на чтение. str было 0x61».Исключение брошено: нарушение прав на чтение

это я мой код:

void main() 
{ 
    int x, i; 
    char* pp; 
    char buffer[SIZE]; 
    printf("Please enter numbers and letters:\n"); 
    gets(buffer); 
    pp = buffer; 
    x = SumStr(*pp); 
    printf("%d", x); 
} 

int SumStr(char* str) 
{ 
    int sum=0, num=0, flag = 0; 
    while ((*str) != '\0') 
    { 
     while (((*str) > '1') && ((*str) < '9')) 
     { 
      if (flag == 0) 
      { 
       num += (*str); 
       flag = 1; 
      } 
      else if (flag == 1) 
       num = num * 10 + (*str); 
      str++; 
     } 
     if (flag == 0) 
      str++; 
     sum += num; 
     num = 0; 
     flag = 0; 
    } 
    return sum; 
} 
+1

Еще советуют: '((* ул)> '1') && ((* ул) < '9') 'is' isdigit (* str) '. Не изобретайте велосипед, используйте стандартные библиотеки. – DyZ

+1

Не нули в ваших номерах? На самом деле вы исключаете '0',' 1' и '9', что немного необычно. –

+0

SO не является отладочной службой. Скомпилируйте с помощью символов, запустите код внутри отладчика, чтобы трассировать программы (программы) по очереди, проверяя значения соответствующих переменных, чтобы узнать, что действительно происходит. Если тогда возникает * конкретный * вопрос, не стесняйтесь возвращаться сюда. – alk

ответ

0

Pass pp, не *pp, функции SumStr. *pp имеет тип char, и функция ожидает char *. На самом деле вам даже не нужно pp, просто передайте buffer в качестве параметра.

также:

Never use gets(). Потому что невозможно сообщить, не зная заранее данные , сколько символов будет читать(), а потому, что gets() будет продолжать хранить символы за конец буфера, это крайне опасно для использования. Он был использован для взлома компьютера безопасности. Вместо этого используйте fgets().

+0

Я проверю его, спасибо! – Jovani

+1

Код должен либо объявить 'SumStr()' перед его использованием с полным прототипом, либо переместить его определение до 'main()', чтобы компилятор мог обнаружить неправильное использование функции.В ее нынешнем виде его руки связаны; не разрешается сообщать о проблемах. –

2

Первая проблема с кодом, вызывающим исключение.

x = SumStr(*pp); 

должно быть

x = SumStr(pp); 

Потому что вы должны передать адрес строки указатель не первый символ, прикрепив Asterix.

Вторая проблема, которая не заставит ее работать.

num += (*str); 

и

num = num * 10 + (*str); 

К (* ул) вы на самом деле добавления значения символов ASCII вместо номера. Это решит проблему, изменив значение ascii на число.

num += (*str) - '0'; 

num = num * 10 + (*str) - '0'; 
+0

0 рассчитывать на мои номера, я забыл ... спасибо за ваш ответ! – Jovani

2

Это может служить ваша цель

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

int main() 
{ 
    int i, sum = 0, store; 
    char str[] = "a14fg5pk145asdasdad6"; 
    int length = strlen(str); 
    for(i = 0; i < length; i++) { 
     store = 0; 
     while(isdigit(str[i])) { 
      store = (store * 10) + (str[i] - '0'); 
      i++; 
     } 
     sum += store; 
    } 
    printf("%d\n", sum); 
    return 0; 
} 

выход:

170