обращая строку целых чисел, пользователь вводит (C) - PullRequest
1 голос
/ 06 февраля 2011

Что я хочу сделать, так это перевернуть строку чисел, которую вводит пользователь. происходит компиляция и запуск до тех пор, пока я не нажму enter после scanf. тогда я получаю ошибку Microsoft во время выполнения ... что происходит не так ???

ПРИМЕЧАНИЕ: это домашняя работа, но у меня есть логика. что меня сбивает с толку, так это ошибка.

#include <stdio.h>

int main()
{
    unsigned int giveStr = 0;
    char* charIt;
    printf("Enter a number to be reversed.\t");
    scanf("%d", &giveStr);
    fflush(stdin);
    sprintf(charIt, "%d", giveStr);
    revStr(giveStr);
    getchar();
    return 0;
}

revStr(unsigned int n)
{
      char buffer[100];
      int uselessvar, counter = 0;
      for (; n > 0;)
          {
           uselessvar = sprintf(&buffer[counter], "%d", n);
           counter++;
           }
        for (counter = 0; counter > 0;)
      {
          printf("%c", buffer[counter]);
          counter--;
      }
return 0;
}

РЕДАКТИРОВАТЬ: сброс stdin для новых строк: / а также изображение здесь только не с этой программой. с моим.

Ответы [ 3 ]

4 голосов
/ 06 февраля 2011

Вы пытаетесь получить доступ к памяти, которая не выделена в:

 sprintf(charIt, "%d", giveStr);

Изменить символ * charIt; обуглить [50]; и все должно быть хорошо (ну, по крайней мере, часть ошибки сегментации)

Также ... передайте charIt в revStr, так как charIt содержит строку с нашим номером. Тогда простой цикл for в revStr сделает свое дело (во всяком случае, что было целью второго?)

void revStr(char *giveStr)
{
  int counter;
  for (counter = strlen(giveStr)-1; counter >= 0; counter--)
  {
    printf("%c", giveStr[counter]);
  }
  printf("\n");
}

Это напечатает каждый символ, который есть в нашем представлении, от последнего до первого. Вы должны прочитать больше о циклах; -)

1 голос
/ 06 февраля 2011

Если у вас есть домашняя работа, если у вас есть книга K & R , перейдите к разделу 3.5 и внимательно прочтите его. Особенно функции reverse() и itoa(). Это должно дать вам довольно хорошее представление о том, как решить вашу домашнюю задачу.

1 голос
/ 06 февраля 2011

Как ваша программа выходит из цикла for (; n> 0;)?Не будет ли счетчик просто увеличиваться до тех пор, пока вы не получите ошибку шины?

ED:

С уважением, я думаю, что утверждение, что «я понял логику» немного оптимистично.: ^) Несомненно, кто-то опубликует, как это должно было быть сделано к тому времени, как я закончил писать это, но, вероятно, стоит обратить внимание на то, что пошло не так (кроме проблем с выделением памяти, отмеченных в другом месте):

Ваш первый цикл, for (; n> 0;), странный, потому что вы печатаете все число n в буфер на счетчике.Так зачем вам делать это более одного раза?Если вы выбираете отдельные цифры, вы можете, но это не так, и, очевидно, вы знаете, как это сделать, потому что вы уже использовали "sprintf (charIt,"% d ", giveStr);".[В стороне: giveStr не является хорошим именем для целой переменной без знака!]

Ваш второй цикл также имеет странные условия: вы устанавливаете счетчик на 0, устанавливаете условие, что счетчик> 0, а затем уменьшаете счетчик внутри,Это, очевидно, не будет зацикливать персонажей так, как вы хотите.Предполагая, что вы думали, что первый цикл был посимвольным, тогда, возможно, вы думали обойти цикл от счетчика-1 до 0?

...