Консультация № 188954
16.03.2016, 17:23
0.00 руб.
0 5 1
Уважаемые эксперты! Пожалуйста, помогите исправить код:
Условие задачи: функция int stonum( char *str ), преобразует строку цифр str
(возможен ведущий знак ‘+’ или ‘-‘) в число типа int.

Я уже написал эту программу, это 2-ая версия, тк теперь пытаюсь научиться использовать только указатели. Но, скорее всего, не до конца понял принципы работы с ними. Пожалуйста, помогите найти ошибки и разобраться с ними!

Код:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int stonum( char *str );
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
printf("Введите строку чисел str: ");
char str[128];
gets(str);
printf("Результат: %d", stonum(str));
return 0;
}
int stonum( char *str )
{
int zn=1,k=1,res=1;
if (*str=='-')
{
zn=-1;
str++;
}

for (; *str!='\0'; str++)
{
if ((*str>='48') && (*str<='57'))
k=k*10;
}
for (; *str!='\0'; str++)
{
res+=(*str-'0')*k;
k/=10;
}
res=(zn*res)/10;
return res;
}

Обсуждение

давно
Посетитель
398702
3
16.03.2016, 19:53
общий
У Вас очень странный алгоритм...ну да ладно. Каждый извращается по своему.
1) if ((*str>='48') && (*str<='57')) заменить на if ((*str>='0') && (*str<='9')). либо убрать одинарные кавычки.
2) У Вас отсутствует проверка на "+"
Ну и причина - Вы не возвращаете указатель str на начало массива перед вторым циклом.

Ваш исправленный код:
Код:

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

int stonum( char *str );
int main()
{

printf("Введите строку чисел str2: ");
char str[128];
gets(str);
printf("Результат: %d", stonum(str));
return 0;
}
int stonum( char *str )
{
int zn=1,k=1,res=1;
if (*str=='-')
{
zn=-1;
str++;
}
char *temp = str;
for (; *str!='\0'; str++)
{
if ((*str>='0') && (*str<='9'))
k=k*10;
}
str = temp;
for (; *str!='\0'; str++)
{
res+=(*str-'0')*k;
k/=10;
}
res=(zn*res)/10;
return res;
}


Моё извращение (может что-то возьмете на заметку):
Код:

int main()
{
char string [256];
printf ("Введите последовательность чисел: ");
gets (string); // warning: unsafe (see fgets instead)
printf("Результат: %d", stonum(string));
return 0;
}

bool isNumber(char ch){
if ((ch>='0') && (ch<='9')) return true;
return false;
}

int stonum( char* str)
{
bool isSign = false;
if ((*str == '+') || (*str == '-')) {
if (*str == '-') isSign = true;
str++;
}

if (isNumber(*str)) {
int number = *str - '0';
while(isNumber(*(++str))){
number *= 10;
number += *str - '0';
}
return ((isSign) ? -number : number);
}
return 0; // Bad number.
}

// Не помню есть ли в С bool и true. при необходимости заменить на int и 1.

давно
Посетитель
399292
22
16.03.2016, 20:31
общий
Адресаты:
Спасибо большое за помощь!
давно
Старший Модератор
31795
6196
17.03.2016, 09:14
общий
Адресаты:

может ответите?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
398702
3
17.03.2016, 14:31
общий
это ответ
Здравствуйте, YarLam125!
1) if ((*str>='48') && (*str<='57')) заменить на if ((*str>='0') && (*str<='9')). либо убрать одинарные кавычки.
2) У Вас отсутствует проверка на "+"
Ну и причина - Вы не возвращаете указатель str на начало массива перед вторым циклом.
5
давно
Посетитель
7438
7205
17.03.2016, 20:55
общий
Адресаты:
Цитата: D-mon55
есть ли в С bool и true
Есть!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа