строка в целое число - PullRequest
3 голосов
/ 11 июля 2010

Я создал программу, которая преобразует числа, введенные в строку, в целое число, как atoi, но дает неправильный вывод.

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<string.h>
void main(void)
{
 static int sum;
 int i,x,y,z;
 char string[10];
 printf("Enter a string:\n");
 gets(string);
 x=strlen(string);
 for(i=0; ;i++)
 {
  if(string[i]=='\0')
  {
   break;
  }
  y=pow(10,i);
  z=string[x-i+1]*y;
  sum+=z;
 }
 printf("%d",sum);
 getch();
}

Ответы [ 3 ]

5 голосов
/ 11 июля 2010

Хорошо.Вот краткий обзор вашего кода.Комментарии встроены.

#include<stdio.h>

Оставьте пробел между #include и <stdio.h>.

#include<conio.h>

Это нестандартный заголовок только для Windows, который вам не нужен.Не включайте это.

#include<math.h>
#include<string.h>

Снова используйте пробел при включении ваших заголовков.

void main(void)

Хотя это допустимо, чаще встречается поиск подписи int main(int argc, char* argv[])в качестве подписи для основной функции.Я бы посоветовал вам использовать эту подпись.

 {
     static int sum;

Почему вы делаете это статичным?Планируете ли вы повторно вызывать main и хотите, чтобы предыдущий результат для sum сохранялся от одного вызова main к другому?Если нет, то не делайте его статичным.

 int i,x,y,z;
 char string[10];

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

printf("Enter a string:\n");
gets(string);

Нет.Не делай этого !!! Функция получает серьезную уязвимость безопасности! .Это делает вашу программу восприимчивой к атакам переполнения буфера.Вместо этого используйте fgets и укажите размер буфера, который вы хотите заполнить, чтобы он не превышал ваш буфер.Вы никогда не должны использовать обычные get.

x=strlen(string);

Подумайте о выборе более описательного имени для x.Возможно len.Совершенно нормально (и хорошо) создавать переменные, идентификаторы которых длиннее одной буквы.

for(i=0; ;i++)
{
  if(string[i]=='\0')
  {
     break;
  }

Подумайте о том, чтобы поместить условие завершения в цикл for;for(i = 0; string[i]!='\0'; i++).

  y=pow(10,i);
  z=string[x-i+1]*y;

Подсказка: есть более разумный способ сделать это, чем использовать pow.

  sum+=z;
 }
 printf("%d",sum);

Ok.Вышеприведенное хорошо, хотя вы можете использовать «% d \ n».

 getch();

Вы не должны делать это на всех системах.Вместо этого выполните:

#ifdef _WIN32
    system("pause");
#endif

Если возможно, я бы посоветовал вам избежать этого странного паузы.Предположим, ваш профессор использует автоматизированный скрипт для проверки результатов вашей программы.Установка любой паузы в программе (даже в Windows) сломает такой скрипт.Если вы не хотите, чтобы окно терминала исчезало во время работы в Windows, вам следует вызвать вашу программу из командной строки.

}

Если вы измените подпись на что-то, возвращающее int, как я предлагал, тогдаВы хотите добавить оператор return 0; до конца функции.

5 голосов
/ 11 июля 2010

Ваша строка не содержит int значений 0, 1, 2, ... 9.

Они содержат char значений '0', '1', '2', ... '9'.Закодировано, например, в ASCII, '0' == 48.

Вам необходимо преобразовать char в int;Один из способов сделать это - вычесть '0', например:

z = (string[x-i+1] - '0') * y;

Связанные вопросы


По схеме Хорнера

Вы можететакже лучше, не используя pow, используя схему Хорнера.

Вот пример (здесь ^ обозначает возведение в степень вместо побитового-xor):

8675309 = 8*10^6 + 6*10^5 + 7*10^4 + 5*10^3 + 3*10^2 + 0*10^1 + 9*10^0
        = (((((8*10 + 6)*10 + 7)*10 + 5)*10 + 3)*10 + 0)*10 + 9

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

В табличной форме:

step   result  digit  result*10+digit
   1   init=0      8                8
   2        8      6               86
   3       86      7              867
   4      867      5             8675
   5     8675      3            86753
   6    86753      0           867530
   7   867530      9          8675309=final

Я оставлю вас для реализацииэтот простой алгоритм самостоятельно, так как это домашнее задание.

См. также

Похожие вопросы

2 голосов
/ 11 июля 2010

должно быть:

z=(string[x-(i+1)]-'0')*y;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...