想弄清楚如何在c中输出电话号码吗?

zyfwsgd6  于 2022-12-26  发布在  其他
关注(0)|答案(7)|浏览(239)

我正在尝试输入电话号码并以这种格式打印出来(888)999-1111格式,但当我试图打印出来时,我得到了一些奇怪的输出,这不是我所期望得到的。我正在打印出phone的值,在输入和打印函数bt中,它们是不同的。输入功能中的正确,但打印功能中的不正确。提前感谢您的帮助。

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;
}
wydwbb8l

wydwbb8l1#

你需要将一个值存储为intlong int或其他数值类型的唯一原因是你必须对它进行算术运算(除非是家庭作业要求)。不要被电话号码是由数字组成的这个事实所迷惑--最有意义的是存储为字符串!
如果您 * 可以 * 将电话号码存储为字符串,则应该:

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

一旦你有了它,就更容易对它执行字符串操作了:

printf("(%.3s) %.3s-%.4s\n", phone, phone + 3, phone + 6);
xpszyzbs

xpszyzbs2#

电话号码应存储为countryareasubscriber
您给出的示例为1 888 9991111
请注意,国家/地区号码的任何前导00实际上是 * 指示交换机拨打国际号码的本地方法 *。在西班牙,很长一段时间以来都是9。国际号码拨号的通用标识现在是+
另请参见https://www.internationalcitizens.com/international-calling-codes/

k4aesqcs

k4aesqcs3#

Sarah,首先我会将电话号码扫描为字符串,这样做更容易。另一个原因是将其扫描为字符串long int可能不够,在一些平台上long是32位。但如果您需要'long int',最好的方法是:

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);
tquggr8v

tquggr8v4#

在您现有的代码中,问题在于循环:

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));

打印output时,请在printf中使用"%c"
OP发布的代码中的问题列表。这些只是OP发布的代码中的问题。逻辑可以通过许多其他方式完成,但是,此答案仅关注OP代码中的问题:

  • phoneInput函数应返回long int而不是int
  • for and while loop-不需要两个循环。这是主要错误。这会导致每次都覆盖数组中的相同位置。
  • 数组位置的循环计数器从0开始,导致数字以相反顺序写入数组
  • 由于您使用的是char数组,因此存储和打印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
gdx19jrr

gdx19jrr5#

我对你的代码做了一些修改。请看一下。

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;
}
ds97pgxw

ds97pgxw6#

空打印电话号码(向量电话号码){字符串电话键盘[10] {“000”,“111”,“ABC”,“DEF”,“GHI”,“JKL”,“MNO”,“PRS”,“TUV”,“WXY”};

size_t PHONE_NUMBER_LENGTH = phoneNum.size();
size_t LETTERS_PER_KEY = 3;
size_t maxcount = (size_t )pow(LETTERS_PER_KEY, PHONE_NUMBER_LENGTH);

// Could have used: colIndex[PHONE_NUMBER_LENGTH] = {0};
vector<int> letterIndex(PHONE_NUMBER_LENGTH, 0);   // Use either name: colIndex or charIndex

for(int count=0; count<maxcount; count++) {
    // print string
    string str = "";
    for(int i=0; i<PHONE_NUMBER_LENGTH; i++) {
        str += phonePad[phoneNum[i]][letterIndex[i]];
    }
    cout << str << endl;
    
    // Update next letter (column) indicies
    int nextCount = count + 1;   // next count
    size_t i = PHONE_NUMBER_LENGTH - 1;
    do {
        letterIndex[i] = nextCount % LETTERS_PER_KEY;
        nextCount = nextCount / LETTERS_PER_KEY;
        i--;
    } while(nextCount > 0);
}

}
算法:有3^n组合n位数字的电话号码。例如:电话号码[n] = {2,3,4} =〉3^3 = 27。请使用额外的空间来跟踪数字中的字母=〉letterIndex[电话号码长度]

eyh26e7m

eyh26e7m7#

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

以及

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

是要使代码正常工作而需要在代码中进行的更改。
第一个变化(+ '0')是将int转换为char,第二个变化是因为要打印char而不是int。
我建议您查看printf的手册和ascii table以更好地理解。

相关问题