Member 13887543 Ответов: 2

Как заставить функцию возвращать полную строку


я сделал функцию и добавляю 1 к строке, которую я даю в качестве входных данных, но функция не возвращает полную строку ......
#include <stdio.h>
#include <string.h>
char *return_and_pass(char x[])	// OR char return_and_pass(char *s)
    {
         int i,carry;
    i=0;
    x[i]=x[i] + 1;
    carry=x[i]/10;
    i++;
   while(carry>0)
  {   x[i]=x[i] + carry;
      carry=x[i]/10;
       if(x[i]>9)
    { x[i]=x[i]%10;
        i++;}
  }
     return x;
    //return it
    }
     
int main()
    {
    	char a[10];
    	gets(a);
    	puts(return_and_pass(a));
    	return 0;
    }


что я получаю в качестве вывода:-
когда я ввожу строку "123"
он показывает мне выход только как 2....

где проблема в моем коде?

Что я уже пробовал:

я уже пробовал этот код...
#include <stdio.h>
#include <string.h>
char *return_and_pass(char x[])	// OR char return_and_pass(char *s)
    {
         int i,carry;
    i=0;
    x[i]=x[i] + 1;
    
  }
     return x;
    //return it
    }
whem in 
    
int main()
    {
    	char a[10];
    	gets(a);
    	puts(return_and_pass(a));
    	return 0;
    }


когда я использую this.....it дает правильный вывод, но когда я добавляю цикл while в код, как и в предыдущем случае, он дает неправильный ответ.....???

ответ должен быть 223.

2 Ответов

Рейтинг:
4

Kornfeld Eliyahu Peter

Вы работаете со строковым представлением 123, поэтому на самом деле вы работаете со значениями 31, 32, 33 (ASCII (HEX) значения символа '1', '2', '3')...
Так что вы ни за что не получите "правильное" значение...
Не понимая причин такого непонятного кода... сделайте это:
1. Реверс строки
2. Преобразовать его в числовое
3. +1
4. Преобразовать в строку
5. Повернуть его вспять


OriginalGriff

*кашель* гекс *кашель*

Kornfeld Eliyahu Peter

Ну же! Вы должны оставить что-то молодым!!!

OriginalGriff

ЛОЛ.

Member 13887543

спасибо за вашу помощь. это сработало.

Рейтинг:
12

OriginalGriff

Посмотри на свой код.
Вы добавляете единицу к первому символу в строке:

x[i]=x[i] + 1;
Таким образом, строка становится "223". Затем вы разрабатываете свой перенос:
carry=x[i]/10;
который... не делает того, что ты думаешь...
x[i] - это значение символа и содержит '2' - это не то же самое, что значение 2, это символ, поэтому на самом деле он имеет значение 50 как число: Таблица Ascii - коды символов ASCII и html, восьмеричное, шестнадцатеричное и десятичное преобразование диаграмм[^Поэтому, когда вы делите это на десять, вы получаете 5.
Остальная часть вашего кода просто портит строку, потому что вы не поняли, в чем разница между символами и числами.

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


Member 13887543

Это мой модифицированный код. У меня возникли проблемы с такими числами, как 99,199,999... в котором нет 9-х больше, чем 2, как в 99-м я получаю выход как
00, но не 100.......и я получаю ошибку сегментации с этими числами с числами, которые мой вывод верен....что мне нужно исправить в моем коде???

#включить <stdio.h>
#include <string.h>
char *return_and_pass(char x[]) // или char return_and_pass(char *s)
{ int i,carry,l=strlen(x);
i=0;
если(x[i]< '9')
{ x[i]=x[i]-'0' + '1';
ставит(x);}
еще
{
x[i]='0';
перенос=1;
я++;
в то время как(carry>0)
{ if(x[i]='9')
{ x[i]='0';
перенос=1;
я++;
если(i==l)
{x[i]='1';}
}
еще
{ x[i]=x[i] - '0' + '1';
carry=(x[i]-'0')/10;
если(x[i]> '9')
{ x[i]=(x[i]-'0')%10;
я++;}
}
}
}

ставит(x);
вернуться х;
//вернуть его
}

void rev(char x[])
{
int i,carry,l=strlen(x);
чар к;
для(i=0;i<l/2;i++)
{
k=x[i];
x[i]=x[l-i-1];
x[l-i-1]=k;
}
}


тап_п()
{
char a[10];
получает(а);
оборотов(а);

ставит(return_and_pass(а));
возвращает 0;
}

Member 13887543

**редактировать**
в строке 3-й "с другими номерами *"

OriginalGriff

Итак, что вы пытались сделать, чтобы выяснить, почему?
Вы использовали отладчик?
Вы пробовали этот алгоритм вручную, прежде чем начать кодирование?
Подсказка: нет, вы этого не сделали - что было большой ошибкой. Почему? Потому что вы работаете не с того конца. Подумайте об этом: если я дам вам число, например 12345, и вы добавите к нему единицу, вы ожидаете, что начнете с добавления 1 к 1 или 5?

Вот что я хотел бы сделать: написать функцию, которая принимает указатель на символ и целое число и возвращает целое число. Функция добавляет целое число к символу указателя, нормализует его до цифры и возвращает 1, Если символ был больше 9 до нормализации. С другой стороны, он возвращает ноль. Это значение 0 или 1 является вашим "переносом" на следующую цифру. Заставьте это работать - и это довольно просто - и вы можете вызвать его в цикле, чтобы сделать все цифры, независимо от того, сколько их есть. Просто начните с наименее значимой цифры.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Member 13887543

Спасибо! это действительно помогло

OriginalGriff

Всегда пожалуйста!