我正在创建一个程序,该程序将输入的名称和数字存储到数据结构中。目前,我试图做一个简单的函数来获取输入(名称和数字)并将其插入到两个数组中。我的输入必须采用以下格式:姓名号码。例如
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
char *nme;
int* nmbr;
[nme
和nmbr
是指针,您应该在写一些东西之前分配一些内存。
也以字符串形式读取电话号码。
您现在正在做的是将电话号码存储到int数组nmbr的第一个元素中。这意味着只有nmbr [0]包含一个值,其余的(1到11)只是垃圾(大概为0)。这样做的原因是scanf接受一个整数指针(如nmbr一样)并将它从stdin读取的值存储到该整数中。不在乎nmbr属于更大的数组,它只是填充第一个元素。现在,由于您提供的数字大于可容纳的整数,因此该值将被截断,并且并非该数字的所有内容都解析为int。这就是为什么您会收到奇怪的行为的原因。
我也建议将电话号码也存储为字符串,因为您永远不需要用它来计算,是吗?该字符串仅包含数字的事实无关紧要。它仍然是字符串,而不是整数。
如果代码仍然想将电话号码保存为整数,建议存储电话号码的值和长度。
对于线路输入,建议先输入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
您可以从各种各样的答案中看出,有很多很多方法可以解决此问题。您提到您最终会将值存储在某些data structure
中。这提出了一个很好的考虑点。最好将每个值保存在一个集合中(例如struct
),而不是将每个值存储在单独的数组中,这样您就不必跟踪在保存数据pieces
的多个容器上建立索引了。
这并不是说使用多个鸽子洞是错误的,而是如果您一开始就通过考虑一个有效的数据存储容器来解决问题,那么它可以简化所需的编码并使代码更健壮。
由于您正在从stdin
中读取数据,因此我将所有建议都使用面向行的输入(line
或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;
}
输出:
$./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
#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();
}