Проблема, которая вызывает ваш код не работает в том, что у вас есть точка с запятой после for
заявления, как это:
for(i = 1; i < sizeMe + 1; i++);
{
string[i] = arr[sizeMe - i] + '0';
}
Этот код будет эквивалентно следующему:
for(i = 1; i < sizeMe + 1; i++){}
string[i] = arr[sizeMe - i] + '0';
Так что происходит только в том, что записывается только последний элемент string
, остальное остается пустым, что порождает неопределенное поведение. Чтобы решить проблему, удалите точку с запятой. Я также рекомендую поставить {
в конце строки инструкции for вместо новой строки, так как это не позволит вам совершать такие ошибки. Таким образом, это правильный код, отформатированный в том, что я рекомендую форматирование:
for(i = 1; i < sizeMe + 1; i++){
string[i] = arr[sizeMe - i + 1] + '0';
}
Обратите внимание, что вы забыли о +1
в arr[sizeMe - i + 1]
.
Хотя это была ошибка, из-за которой ваш код работал не так, как вы хотели, чтобы он работал, вы также допустили несколько других ошибок, которые могут привести к сбою вашей программы.
Прежде всего, в цикле for вы не тестируете, если i
больше, чем LENGTH
. Проблема в том, что если i
больше LENGTH
, string[i]
будет находиться вне массива, что вызовет переполнение буфера и приведет к сбою вашей программы. Чтобы решить эту проблему, добавьте следующий код внутри вашего цикл:
if(i + 1 > LENGTH){
break;
}
break
оператор выйдет для цикла немедленно. Обратите внимание, что мы тестируем, если i + 1
больше LENGTH
, чтобы оставить пробел для нулевого символа в конце строки.
По этой же причине string[sizeMe] = 0;
также плох, так как ничего не говорит о том, что sizeMe
меньше размера массива. Вместо этого используйте string[i] = 0;
, так как i
был увеличен до или после LENGTH
или sizeMe
. Поэтому i
будет минимальным из этих двух значений, чего мы хотим.
Вам также необходимо вернуть что-то в конце функции main
. Функция main
имеет тип int
, поэтому она должна вернуть int
. В C++ этот код не будет компилироваться из-за этого. Ваш код, скомпилированный с тех пор, как вы используете компиляторы C и C, как правило, более терпимы, чем компиляторы C++, поэтому вы получили только предупреждение. Обязательно исправьте все предупреждения компилятора, так как это может решить ошибки. Предупреждения помогут вам, а не раздражать вас. Как правило, функция main
должна возвращать 0, так как это значение обычно означает, что все прошло хорошо.Поэтому вам нужно добавить return 0;
в конце функции main
.
Таким образом, это код, который вы должны использовать:
#include <stdio.h>
#include <string.h>
#define LENGTH 50
int getLength(int num, int arr[]);
int main(){
int num = 0, i = 0;
int arr[LENGTH] = {0};
char string[LENGTH] = {0};
printf("enter number: ");
scanf("%d", &num);
int sizeMe = getLength(num, arr);
string[2] = arr[2] + '0';
printf("length %d one of values: %c", sizeMe,string[2]);
for(i = 1; i < sizeMe + 1; i++){
string[i] = arr[sizeMe - i + 1] + '0';
if(i + 1 > LENGTH){
break;
}
}
string[0] = '+';
string[i] = 0;
printf("string: %s", string);
return 0;
}
int getLength(int num,int arr[]){
int count = 0;
int i = 0, temp = 0;
while(num != 0){
temp = num%10;
num /= 10;
count++;
i++;
arr[i] = temp;
printf("index %d is %d\n",i,arr[i]);
}
return count;
}
Кроме того, как некоторые программист чувак отметил в комментарии, это намного проще в использовании sprintf
. Тогда ваш код будет гораздо проще:
#include <stdio.h>
#include <string.h>
#define LENGTH 50
int main(){
int num = 0;
char string[LENGTH] = {0};
printf("enter number: ");
scanf("%d", &num);
sprintf(string, "%c%d", num >= 0 ? '+' : '-', num);
printf("string: %s", string);
return 0;
}
Почему бы не просто использовать, например, 'Sprintf'? –
Что касается решения вашей проблемы с кодом, который у вас есть, то пришло время узнать, как использовать отладчик. С помощью отладчика вы можете переходить через код по строкам, контролируя переменные и их значения. –
Как сказал @Someprogrammerdude, лучше быть здесь ленивым и просто использовать 'sprintf'. – RoadRunner