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

时间:2014-11-22 16:21:50

标签: c arrays int scanf

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

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

5 个答案:

答案 0 :(得分:3)

char *nme;    
int* nmbr;

nmenmbr是指针,你应该在给它写东西之前指定一些内存。

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

答案 1 :(得分:2)

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

我建议将电话号码存储为字符串,因为你永远不需要用它来计算,是吗?这个字符串只包含数字的事实并不重要。它仍然是一个字符串而不是整数。

答案 2 :(得分: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

答案 3 :(得分:1)

从各种答案可以看出,有很多方法可以解决这个问题。您提到最终会将值存储在某些data structure中。这提出了一个值得考虑的好点。您可以更好地保留集合中的值(例如struct),而不是将每个值存储在单独的数组中,从而消除了需要跟踪保存pieces的多个容器的索引的情况。你的数据。

这并不是说使用多个pigeon-hole是错误的,相反,如果你通过在开始时考虑一个有效的数据容器来解决问题,它可以简化所需的编码并使你的代码更加健壮。

由于您正在阅读stdin中的数据,因此我会使用面向行的输入({}将您读取整个line数据的所有建议放到缓冲区中。 {1}}或fgets)而不是试图将其标记为getline格式字符串(您也可以使用scanf作为面向行的输入,但其他人提供了几个优点)。

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

记住这些注意事项,以下是如何合并它们的快速示例,同时提供一个相当灵活的数据输入例程来处理Xname numberfirst last number等....合理评论。如果您有任何疑问,请发表评论。

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

答案 4 :(得分:1)

#include<stdio.h>

main()
{
    unsigned long long num;
    printf("Enter: ");
    scanf("%llu",&num);
    int i=9,n;
    unsigned int array[10];

    while(num>0)
   {
        n=num%10;
        array[i]=n;
        num=num/10; 
        i--;
   }

   for(i=0;i<10;i++)
   {
       printf("%u",array[i]);
   }
}