我正在创建一个程序,它将输入中的名称和数字存储到数据结构中。目前,我正在尝试创建一个简单的函数来获取输入(名称和数字)并将其插入到两个数组中。我的输入必须采用以下格式:名称编号。 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
答案 0 :(得分:3)
char *nme;
int* nmbr;
nme
和nmbr
是指针,你应该在给它写东西之前指定一些内存。
也以字符串形式阅读电话号码。
答案 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
存储量。 (您仍然会分配一些初始存储空间,但随着数据的增长,您可以根据需要轻松扩展。
记住这些注意事项,以下是如何合并它们的快速示例,同时提供一个相当灵活的数据输入例程来处理X
,name number
,first 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]);
}
}