Пытаетесь выяснить, как вывести номер телефона в с? - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь ввести номер телефона и распечатать его в этом формате (888)999-1111, но когда я пытаюсь его распечатать, я получаю какой-то странный вывод, который я не ожидаю получить обратно,Я печатаю значения телефона как на входе, так и в функции печати, но они разные.Один в функции ввода является правильным, но он не является правильным в функции печати.Заранее спасибо за помощь.

int phoneInput(void)
{
    long int phone = 0;

    printf("Input the politicians phone number with no speaces: ");
    scanf("%ld", &phone);
    printf("test : %ld", phone);
return phone;
}

int printPhone(long int phone)
{
    int i = 10; //the number of digits in the phone
    char output[11];

    printf("Test: %ld", phone);

    for (i = 0; i < 10; i ++)
    {
    while (phone > 0)
    {
            output[i] = phone % 10;
            phone /= 10;
    }
    }

    printf("- Phone number: (");
    i = 0;
    for (i = 0; i < 3; i++)
    {
            printf("%d", output[i]);
    }

    printf(")");
    i = 3;
    for(i = 3; i < 6; i++)
    {
            printf("%d", output[i]);
    }
    i = 6;
    printf("-");
    for(i = 6; i < 10; i++)
    {
            printf("%d", output[i]);
    }

return 0;
}

Ответы [ 6 ]

0 голосов
/ 01 февраля 2019

Номер телефона должен быть сохранен как country, area, subscriber.

. Пример, который вы привели, будет 1 888 9991111

И обратите внимание, что любой ведущий 00 для номера страны фактически локальный метод указания коммутатору набирать международный номер .В Испании это было 9 в течение длительного времени.Общий номер для набора международного номера теперь +.

См. Также https://www.internationalcitizens.com/international-calling-codes/

0 голосов
/ 01 февраля 2019

В вашем существующем коде проблема заключается в циклах:

for (i = 0; i < 10; i ++)
{
while (phone > 0)
{
        output[i] = phone % 10;
        phone /= 10;
}
}

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

i = 9;
do
{
        output[i] = (phone % 10) + '0';
        phone /= 10;
        i--;
}while((phone > 0) && (i >= 0));

Пожалуйста, используйте "%c" в printf при печати output.


Список проблем в коде, опубликованном OP.Это просто проблемы в коде, опубликованном OP.Логика может быть реализована многими другими способами, но этот ответ просто фокусируется на проблемах в коде OP как есть:

  • phoneInput функция должна возвращать long int вместо int
  • for and while loop - Две петли не нужны.Это главная ошибка.Это приводит к тому, что одна и та же позиция в массиве перезаписывается каждый раз.
  • Счетчик цикла для позиции массива начинается с 0, в результате чего цифры записываются в обратном порядке в массиве
  • Поскольку вы используетемассив символов, сохраняйте и печатайте char вместо int.

Полный код с исправленными проблемами (согласно исходному коду OP):

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

long int phoneInput(void)
{
    long int phone = 0;

    printf("Input the politicians phone number with no spaces: ");
    scanf("%ld", &phone);
    printf("test : %ld\n", phone);

    return phone;
}

int printPhone(long int phone)
{
    int i = 10; //the number of digits in the phone
    char output[11];

    memset(output, '0', sizeof(output));

    printf("Test: %ld\n", phone);

    i = 9;
    do
    {
       output[i] = (phone % 10) + '0';
       phone /= 10;
       i--;

    }while( (phone > 0) && (i >= 0));


    printf("- Phone number: (");
    i = 0;
    for (i = 0; i < 3; i++)
    {
            printf("%c", output[i]);
    }


    printf(")");
    i = 3;
    for(i = 3; i < 6; i++)
    {
            printf("%c", output[i]);
    }
    i = 6;
    printf("-");
    for(i = 6; i < 10; i++)
    {
            printf("%c", output[i]);
    }

return 0;
}

void main()
{
  long int phone;

  phone = phoneInput();
  printPhone(phone);

}

Выход:

Input the politicians phone number with no spaces: 8889991111
test : 8889991111
Test: 8889991111
- Phone number: (888)999-1111
0 голосов
/ 01 февраля 2019
while (phone > 0)
{
        output[i++] = (phone % 10) + '0';
        phone /= 10;
}

и

printf("%c", output[i]);

- это изменения, которые необходимо внести в ваш код, чтобы он работал.

Первое изменение (+ '0') - это преобразование изint до char.Второй - потому что вы хотите напечатать char, а не int.

Я советую вам проверить руководство printf и таблицу 1011 * ascii , чтобы лучше понять.

0 голосов
/ 01 февраля 2019

Я сделал несколько изменений в вашем коде.Пожалуйста, посмотрите.

long long int phoneInput(void)
{
    long long int phone = 0;

    printf("Input the politicians phone number with no speaces: ");
    scanf("%lld", &phone);
    printf("test : %lld", phone);
return phone;
}

int printPhone(long long int phone)
{
    int i = 10; //the number of digits in the phone
    char output[11];

    printf("Test: %lld", phone);

    i = 9;     // removed for loop that was unnecessary.
    while (phone > 0)
    {
            output[i] = phone % 10;
            phone /= 10;
            i--;   
    }

    printf("- Phone number: (");
    i = 0;
    for (i = 0; i < 3; i++)
    {
            printf("%d", output[i]);
    }

    printf(")");
    i = 3;
    for(i = 3; i < 6; i++)
    {
            printf("%d", output[i]);
    }
    i = 6;
    printf("-");
    for(i = 6; i < 10; i++)
    {
            printf("%d", output[i]);
    }

return 0;
}
int main(int argc, char const *argv[])
{
    long long int n = phoneInput();
    printPhone(n);
    return 0;
}
0 голосов
/ 01 февраля 2019

Сара, во-первых, я бы отсканировал номер телефона как строку, так проще сделать.Другая причина для сканирования его как строки long int может быть недостаточной, на некоторых платформах длина 32 бита.Но если вам требуется long long, лучшим способом будет:

 printf ("(%ld)", number / 10000000); // prints area code (xxx)
 printf (" %ld-", (number / 1000) % 1000); // prints xxx-
 printf ("%ld\n", number % 10000); // prints xxxx\n

другим способом будет:

fscanf( stdin, " %3s%3s%4s", areacode, zone, number);
printf("(%s) %s-%s\n", areacode, zone, number);
0 голосов
/ 01 февраля 2019

Единственная причина, по которой вам нужно хранить значение как int, long int или другой числовой тип, заключается в том, что вы должны были сделать арифметику с ним (если это не требуется спецификацией домашнего задания).Не обманывайтесь тем фактом, что номер телефона состоит из цифр - наиболее целесообразно хранить его в виде строки!

Если вы можете сохранить номер телефона в виде строки, вы должны:

char *phoneInput(void)
{
    static char phone[100];
    printf("Input the politicians phone number with no speaces: ");
    fgets(phone, 100, stdin);
    return phone;
}

Как только вы это сделаете, вам будет проще выполнять манипуляции со строками:

printf("(%.3s)%.3s-%.4s\n", phone, phone + 3, phone + 6);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...