如何将输入的电话号码存储到int数组中? C

问题描述 投票:0回答:5

我正在创建一个程序,该程序将输入的名称和数字存储到数据结构中。目前,我试图做一个简单的函数来获取输入(名称和数字)并将其插入到两个数组中。我的输入必须采用以下格式:姓名号码。例如

John 07745234574

然后将名称存储在字符数组中,将数字存储在int数组中。问题是它不会在数字的开头打印0,而是在打印时添加大量重复的数字,然后再添加大量的0。]

我的代码:

int main (void) {
char nme[20];
int nmbr[11];

printf("Enter:");
scanf("%s %d", nme, nmbr);

printf("\n%s ", nme);

int i;
for(i = 0; i<11; i++) {
    printf("%d", nmbr[i]);
    }
return 0;
}

我知道使用%d不会起作用,但我不知道可能不使用循环的另一种方式。另外,如果数字前面有加号,我将如何存储它,例如+442962000292

c arrays int scanf
5个回答
3
投票
char *nme;    
int* nmbr;

[nmenmbr是指针,您应该在写一些东西之前分配一些内存。

也以字符串形式读取电话号码。


2
投票

您现在正在做的是将电话号码存储到int数组nmbr的第一个元素中。这意味着只有nmbr [0]包含一个值,其余的(1到11)只是垃圾(大概为0)。这样做的原因是scanf接受一个整数指针(如nmbr一样)并将它从stdin读取的值存储到该整数中。不在乎nmbr属于更大的数组,它只是填充第一个元素。现在,由于您提供的数字大于可容纳的整数,因此该值将被截断,并且并非该数字的所有内容都解析为int。这就是为什么您会收到奇怪的行为的原因。

我也建议将电话号码也存储为字符串,因为您永远不需要用它来计算,是吗?该字符串仅包含数字的事实无关紧要。它仍然是字符串,而不是整数。


2
投票

如果代码仍然想将电话号码保存为整数,建议存储电话号码的值和长度。

对于线路输入,建议先输入fgets(),然后输入sscanf()

int main (void) {
  char nme[20];
  unsigned long long nmbr;
  int nmbr_len;

  printf("Enter:");
  char buf[100];
  fgets(buf, sizeof buf, stdin);

  int n[2];
  if (sscanf("%19s %n%llu%n", nme, &n[0], &nmbr, &n[1]) != 2) {
    Handle_BadInput();
  }
  nmbr_len = n[1] - n[0];

  printf("%s %0*llu\n",  nme, nmbr_len, nmbr);
  return 0;
}

输入John 07745234574输出John 07745234574


[一些补充想法:下面的OP的2个示例电话号码,如果保留为字符串,则至少需要char nmbr[13]

07745234574
442962000292

甚至更高的上限为15位或24位以上的数字,分隔符,前缀代码,暂停,扩展名等,这都意味着一个健壮的解决方案可能需要应对冗长的字符串。

注意:这里的许多答案都使用著名的电话号码867-5309


1
投票

您可以从各种各样的答案中看出,有很多很多方法可以解决此问题。您提到您最终会将值存储在某些data structure中。这提出了一个很好的考虑点。最好将每个值保存在一个集合中(例如struct),而不是将每个值存储在单独的数组中,这样您就不必跟踪在保存数据pieces的多个容器上建立索引了。

这并不是说使用多个鸽子洞是错误的,而是如果您一开始就通过考虑一个有效的数据存储容器来解决问题,那么它可以简化所需的编码并使代码更健壮。

由于您正在从stdin中读取数据,因此我将所有建议都使用面向行的输入linefgets)而不是将整个getline数据读取到缓冲区中。而不是尝试将其放入scanf格式的字符串中(您也可以将scanf用于面向行的输入,但其他方法也有一些优点)。

随着您的项目的进行,管理数据使用的内存将很重要。您可能希望根据需要分配内存,而不是静态分配X的存储量。 (您仍然分配了一些初始存储块,但是随着数据的增长,可以根据需要轻松扩展。

[牢记这些注意事项,下面是一个简单的示例,说明如何合并它们,同时提供了一个相当灵活的数据输入例程,该例程将处理name numberfirst last numberfirst middle last, suffix number等。...合理地。如果您有任何疑问,请发表评论。

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

#define MAXL 100

/* typedef to name and number struct */
typedef struct {
    char *name;
    char *num;
} nandn;

int main () {

    char *line = NULL;  /* buffer for getline (NULL forces allocation)  */
    size_t n = 0;       /* maximum no. of char to read (0 - no limit)   */
    ssize_t nchr = 0;   /* number of characters actually read           */
    int idx = 0;        /* counter for array of struct index            */
    char *p = NULL;     /* general char pointer to use for parsing      */

    nandn *nnlist = calloc (MAXL, sizeof (nnlist)); /* allocate MAXL structs    */

    printf ("\nEnter name and number to add to book [ctrl+d] when done.\n\n"); 

    while (printf( " name number: ") && 
            (nchr = getline (&line, &n, stdin)) != -1) {

        if (line[nchr-1] == '\n')               /* strip newline                */
            line[--nchr] = 0;

        p = strrchr (line, ' ');                /* find last space              */
        if (!p) break;                          /* exit read - invalid input    */
        (nnlist + idx)->num = strdup (++p);     /* read number                  */
        *(--p) = 0;                             /* return to space and set null */
        (nnlist + idx)->name = strdup (line);   /* read name (all else in line) */

        idx++;              /* NOTE: if idx = MAXL - 1
                            * reallocate nnlist     */
    }

    if (line) free (line);  /* free memory allocated by getline */
    printf ("\n\nThe information collected was:\n\n");

    int i = 0;              /* print all values in nnlist array */
    while ((nnlist + i)->name) {
        printf ("  nnlist[%d]   %-24s  %s\n", i, (nnlist + i)->name, (nnlist + i)->num);
        i++;
    }
    printf ("\n");

    i = 0;                  /* free all memory for nnlist       */ 
    while ((nnlist + i)->name) {
        free ((nnlist + i)->name);
        free ((nnlist + i)->num);
        i++;
    }
    free (nnlist);

    return 0;
}

输出:

$./bin/namnum

Enter name and number to add to book [ctrl+d] when done.

 name number: Jane Doe, Md. 8005551212
 name number: Mike M. Mills, Jr. 2145551212
 name number: Alphred Funk, III 2025551212
 name number:

The information collected was:

  nnlist[0]   Jane Doe, Md.             8005551212
  nnlist[1]   Mike M. Mills, Jr.        2145551212
  nnlist[2]   Alphred Funk, III         2025551212

0
投票
#include<stdio.h>
#include<conio.h>

void main(){

  char phone[16];

  printf("Enter mobile number: ");

  scanf("%s",&phone);

  printf("Your Mobile Number is: %s",phone);

  getch();

}
© www.soinside.com 2019 - 2024. All rights reserved.