2017-01-19 2 views
2

Я пытаюсь превратить int в строку. Я сделал это до сих пор, получив int с scanf, а затем разделил его по его цифрам, а затем поместил каждую из цифр внутри массива int. Затем я хочу поместить все значения int arr внутри строки, где знак + или - будет первым символом. Вот мой код:Как сделать значение int строкой

#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] + '0'; 
    } 
    string[0] = '+'; 
    string[sizeMe] = 0; 

    printf("string: %s", string); 
} 
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; 
} 

Результат этой программы просто «+». Что я сделал здесь неправильно?

+5

Почему бы не просто использовать, например, 'Sprintf'? –

+3

Что касается решения вашей проблемы с кодом, который у вас есть, то пришло время узнать, как использовать отладчик. С помощью отладчика вы можете переходить через код по строкам, контролируя переменные и их значения. –

+1

Как сказал @Someprogrammerdude, лучше быть здесь ленивым и просто использовать 'sprintf'. – RoadRunner

ответ

2

Проблема, которая вызывает ваш код не работает в том, что у вас есть точка с запятой после 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; 
} 
0

Короткий ответ на превращение C Int в десятичную строку, чтобы позвонить Sprintf(). Это приводит к вопросу о том, как это работает sprintf().

Из книги Язык программирования C, 2-е издание раздел 3.6. Существует пример функции, возвращающей строковое представление целого числа. Так вот код:

void numberToString(int n, char *s){ 
    int i, sign; 
    if ((sign = n) < 0) /*record sign*/ 
     n = -n; /* make n positive */ 

    i = 0; 
    do { // generate digits in reverse order 
     s[i++] = n % 10 + '0'; // get next digit*/ 
    } while ((n /= 10) > 0); // delete it 

    s[i++] = sign < 0? '-': '+'; // or -- if(sign < 0) s[i++] = '-'; -- if you want just the sign '-' 
    s[i] = '\0'; 

    strrev(s); //reverse the string 
} 

int main() 
{ 
    int n; 
    char str[LENGTH]; 

    printf("Number: "); 
    scanf("%i", &n); 

    numberToString(n, str); 

    printf("Number as string: %s\n", str); 
} 

strrev определяется в заголовке string.h (так включить его).

+0

'strrev()' не является стандартной библиотечной функцией C. В 'string.h> объявление может не существовать. см. http://stackoverflow.com/q/8534274/2410359 – chux

+0

@chux хорошо он может сделать определение для него, если он еще не определен в 'string.h' (это легко). –

0

Вы можете попробовать и сделать это с помощью sprintf. Когда вы вычисляете длину номера от get_length(), вы можете объявить строковый буфер, статически или динамически. После объявления вы можете отправить отформатированный вывод в буфер с помощью sprintf().

Однако, если вы хотите использовать свой подход, @Donald Duck рассмотрел проблемы в отладке вашего кода, и это просто другой подход, который вы можете использовать, если хотите.

Вот пример:

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

size_t get_length(int number); 

int main(void) { 
    int number; 
    size_t numcnt; 
    char *string; 

    printf("Enter number: "); 
    if (scanf("%d", &number) != 1) { 
     printf("Invalid number entered\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("Number = %d\n", number); 

    numcnt = get_length(number); 

    string = malloc(numcnt+1); 
    if (!string) { 
     printf("Cannot allocate %zu bytes for string\n", numcnt+1); 
     exit(EXIT_FAILURE); 
    } 

    sprintf(string, "%d", number); 

    printf("String = %s\n", string); 

    free(string); 

    return 0; 
} 

size_t get_length(int number) { 
    size_t count = 0; 

    if (number < 0) { 
     number *= -1; 
     count++; 
    } 

    for (size_t i = number; i > 0; i /= 10) { 
     count++; 
    } 

    return count; 
} 

Образец вход 1:

Enter number: 1234 

Пример вывода 1:

Number = 1234 
String = 1234 

вход Образец 2:

Enter number: -1234 

Пример вывода 2:

Number = -1234 
String = -1234 
+0

Большое спасибо, ребята, вы действительно поможете мне, мне нравится этот форум, и я узнал несколько новых вещей. – Gerimeni

+0

@Gerimeni Нет проблем. Если вам понравился один из ответов, дайте ему галочку. – RoadRunner

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