2016-07-14 3 views
0

Я пытался преобразовать строку чисел в целочисленное значение со следующим кодом. Выход всегда на единицу меньше исходного значения. Я не понимаю, что не так с моим кодом.преобразовать числовую строку в целое значение

#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
#include<math.h> 
#include<string.h> 
int main(){ 

    char a[6]; 

    int i,b; 

    scanf("%s",a); 

    for(i=strlen(a)-1;i>=0;i--){ 

     a[i]=a[i]-48; 

     b=b+a[i]*pow(10,(strlen(a)-i-1)); 
    } 

    printf("%d",b); 

    getch(); 

    return 0; 

} 
+0

Является ли назначение сделать преобразование самостоятельно? В противном случае используйте ['strtol'] (http://en.cppreference.com/w/c/string/byte/strtol). Также не используйте [* magic numbers *] (https://en.wikipedia.org/wiki/Magic_number_ (программирование)). Если на '48' вы имеете в виду символ' '0' ', тогда говорите об этом явно. –

+0

Что касается вашей проблемы, здесь не нужно использовать 'pow', простое умножение с' 10'. –

+1

Помимо неопределенного значения 'b', будем ли мы также предполагать, что отрицательные значения не являются опцией или значением больше 99999? – WhozCraig

ответ

0

В коде есть несколько проблем. Для снижения рисков UB:

  1. Если рассматривать char[] в виде строки, его размер должен позволять для размещения \0 завершающего символа.
  2. Если ваш код не инициализирует нестатические значения локальной переменной, вы должны сделать это явно (переменная int b).
  3. Осторожно относитесь к scanf(), если вы читаете строку. Переполнение приводит к UB. Используйте спецификатор ширины поля.
  4. Не смешивайте типы данных (возврат pow() равен double).
  5. Сделайте свой код как можно более плоским, с минимальной математикой, насколько это возможно, особенно внутри петель. Вам совсем не нужно pow().

Пожалуйста, смотрите комментарии по линиям на основе кода:

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

int main(void) 
{ 
    char a[7];  // extra byte for '\0' 
    int i, l, b = 0;//initialize local variable b 
    int ten = 1; 

    scanf("%6s",a); //should use a field width specifier 

    l = strlen(a) - 1; 

    for(i=l ; i>=0 ; i--, ten*=10) 
     b += (a[i]-48)*ten; //do as simple math as practical 

    printf("%d\n",b); 
    return 0; 
} 
3

Проблема, скорее всего, неопределенное поведение потому что вы используете неинициализированные переменные.

В выражении b=b+... вы используете переменную b без ее инициализации. Нестатические локальные переменные не инициализируются и будут иметь неопределенное значение. Использование их без инициализации приводит к UB. Инициализировать его к нулю:

int i, b = 0; 

У вас также есть проблемы с пользователем ввода многих символов для массива a и выходить за пределы. У вас также нет проверок, что пользователь фактически вводил только цифры.

+0

, даже если я инициализирую переменную b, результат остается на 1 меньше исходного значения, но если я не использую функцию pow(), я получаю желаемый результат. но что не так с функцией pow()? – shivam

+0

@shivam ['pow'] (http: //en.cppreference.com/w/c/numeric/math/pow) для * с плавающей запятой *, со всеми проблемами округления, которые приходят с ней. –

+0

@shivam Вероятно, например, 'pow (10, 3)' дает вам 999.999 вместо 1000. (Или, может быть, 'pow (10, 0)' дает вам 0.999 вместо 1.0 или 'pow (10 , 1) 'дает вам 9.999 вместо 10.) –