2013-11-17 2 views
1

Я пытаюсь прочитать строку целых чисел и преобразовать их в цифры 0-9 внутри кода из представления ascii, поэтому добавление со вторым числом позже будет Полегче. Моя проблема здесь заключается только в том, что моя программа не только конвертирует мои символы (числа), которые я ввел в консоль, но и конец строки, который я пытался исключить из моего условия внутри моей функции convert_ascii_to_decimal. Мой результат дает мне правильные десятичные знаки, но дополнительно 100, которые я не понимаю. Это всегда приводит к тому, что условие «обеспечить» должно быть ложным. Любые идеи, как я могу избавиться от этого? СПАСИБО! (Кроме того, мой профессор хочет «размер ИНТ», чтобы быть параметром функции convert_ascii_to_decimal, которую я не понимаю, зачем.)Получение символа конца строки путем преобразования char в десятичные знаки

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

#define MAX 5 

int read_array(char* number, int size); 
int convert_ascii_to_decimal(char* number, int size); 
void ensure(int condition, char* message); 

int main(void){ 

    char number1[MAX + 1]; 
    int i, r, size1; 

    r = read_array(number1, MAX); 
    ensure(r == 0, "Ur number is too long"); 


    size1 = convert_ascii_to_decimal(number1, MAX); 
    //ensure(size1 != 0, "The number contains something other than digits.\n"); 

    for(i = 0; i <= strlen(number1); i++) 
     printf("%d", number1[i]); 

    return 0; 

} 

int read_array(char* number, int size) { 


    printf("\nEnter an integer number at a maximum of 5 digits please.\n"); 
    int result = 0; 
    int count = 0; 
    char* i = number; 
    do { 
     scanf("%c", i); 
     count++; 
    } while (*i++ != '\n'); 
    *i = '\0'; 

    if (count > size + 1) 
     result = 1; 

    return result; 
} 


void ensure(int condition, char* message) { 
    if (!condition) { 
     printf(message); 
     exit(EXIT_FAILURE); 
    } 
} 


int convert_ascii_to_decimal(char* number, int size) { 

    int count = 0; 
    char* i = number; 
    while(*i != '\0'){ 
     if (*i >= 48 && *i <= 57){ 
      *i -= '0'; 
      count++; 
      i++; 
     } 
     else{ 
      return 0; 
      break; 
     } 

    } 

    return count; 
} 
+0

он проверяет, если пользователь ввел правильное количество цифр в консоли. Если его больше 5, он будет жаловаться. Нет. Я хочу преобразовать числа ascii в фактические цифры от 0 до 9, поэтому добавление со вторым номером будет проще позже. –

+0

Извините за это. Я так устал, что сейчас нет смысла для меня :) – zubergu

ответ

0

Это происходит потому, что вы пост-инкремент i в заголовке цикла, а затем установите знак после'\n' на ноль. Ваш do/while петля

do { 
    ... 
} while (*i++ != '\n'); 

заканчивается, когда \n хранится в *i. После этого i увеличивается, поэтому он указывает на символ, который находится за символом конца строки.

Чтобы это исправить, измените эту строку

*i = '\0'; 

к этому:

*(i-1) = '\0'; 
+0

спасибо. конечно! Вы знаете, почему имеет смысл размер параметра в функции ascii_to_decimal? –

+0

@ChrisBo. Вы не используете этот параметр правильно: вы должны проверить его в цикле 'do' /' while', чтобы избежать переполнения буфера. – dasblinkenlight

+0

ok Я предполагаю, что ур говорит о функции read_array, но как насчет функции asii_to_decimal. –

Смежные вопросы