【问题标题】:How can I store a phone number input into a int array? C如何将输入的电话号码存储到 int 数组中? C
【发布时间】:2014-11-22 16:21:50
【问题描述】:

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

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

【问题讨论】:

  • nme 指向哪里?
  • 请不要编辑您的问题以使其“解决”。它使堆栈溢出的整个概念无效。您可能需要一段时间阅读Introductory Tour
  • 为什么投反对票,人们?新人不可能100%完美,他至少发布了一些代码。是的,他应该阅读了介绍性导览,但直到现在他才知道它在那里(感谢@Jongware,提供链接)。过去,我们欢迎新人,现在看来我们把他们赶走了:-(
  • @Mawg:注册新用户时,您可以参加游览。 ...也许需要更大的字体。可能还有&lt;blink&gt;
  • 为什么要使用int 作为数字?电话号码不是数字,它们是字符串;他们的数字只是没有算术意义的字符。

标签: c arrays int scanf


【解决方案1】:
char *nme;    
int* nmbr;

nmenmbr 是指针,你应该在写入之前分配一些内存。

也将电话号码读取为字符串。

【讨论】:

  • “将电话号码也作为字符串读取”并使用 atoi() 确保它确实是一个数字
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    对于线路输入,建议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

    【讨论】:

      【解决方案4】:

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

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

      由于您正在从stdin 读取数据,我将支持您使用面向行的输入fgets 或@ 987654327@) 而不是试图将其归类为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
      

      【讨论】:

        【解决方案5】:
        #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]);
           }
        }
        

        【讨论】:

        • 您可能需要添加一些描述来解释您的代码。
        猜你喜欢
        • 1970-01-01
        • 2015-03-24
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多