我在C编程中非常新,我需要创建一本电话簿。每个条目必须具有名称,电话号码和笔记部分。事实是,音符部分的大小应根据输入为变化。例如,如果用户输入带有30个字符的字符串,则要注意的大小应为30。我不知道该怎么做。
这是我到目前为止的代码:
#include <stdio.h>
#include <stdlib.h>
#include <note>
struct Entries {
char name[50];
char phoneNumber[11];
char * note;
note = (char *)malloc(5*sizeof(char));
}Entries;
int main()
{
int command;
int counter = 0;
char tempNote[50];
char tempName[50];
char tempPhoneNumber[11];
while(1){
printf("Welcome to myPhoneBook! Please select an option:n 1) New entryn 2) List all entriesn 3) Editn 4) Deleten 5) Searchn");
scanf("%d", &command);
if(command == 1){
struct Entries entry;
printf( "Enter a name:n");
scanf("%s",tempName);
strcpy(entry.name, tempName);
printf( "Enter a phone:n");
scanf("%s",tempPhoneNumber);
strcpy(entry.phoneNumber, tempPhoneNumber);
printf( "Enter a note:n");
scanf("%s",tempNote);
entry.note = (char *)realloc(entry.note,strlen(tempNote));
strcpy(entry.note, tempNote);
counter++;
}
}
return 0;
}
当用户首次输入名称,声音和注释时,该程序仍会自动停止工作,尽管该程序应该永远要求将其永远用户用户使用。
您可以使用灵活数组成员。这是更好的方法。
引用C11
标准,第§6.7.2.1章
[...]具有多个命名成员的结构的最后一个元素可以 具有不完整的数组类型;这称为灵活数组成员。在大多数情况下, 灵活的数组成员被忽略。特别是,结构的大小是 省略了灵活的阵列成员,除了它可能具有比 遗漏将暗示。但是,当
.
(或->
)操作员的左操作数为 (指向)具有灵活数组成员和正确操作数的结构 成员,它的举止好像该成员被最长的数组替换(与 元素类型)不会使结构比所访问的对象大;这 阵列的抵消也应保留为柔性阵列成员的成员,即使这会有所不同 从替换阵列的阵列。如果此数组没有元素,它的行为就好像 它有一个元素,但是如果试图访问该行为,则行为是不确定的 元素或生成一个指针一个。
和示例
声明后的示例2:
struct s { int n; double d[]; };
结构
struct s
具有灵活的数组成员d
。使用它的典型方法是:int m = /* some value */; struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));
并假设对
malloc
的呼叫成功,而p
指向的对象出于大多数目的,就好像p
已被宣布为:struct { int n; double d[m]; } *p;
现在,遵循上面的内容,您可以扫描输入,将输入长度作为m
,然后分配足够的内存来保存输入。
替换
entry.note = (char *)realloc(entry.note,strlen(tempNote));
entry.note = malloc(strlen(tempNote) + 1);
也
删除
note = (char *)malloc(5*sizeof(char)
来自struct
定义。它不属于那里。
我建议先学习C的基础知识。C实际上只是带有宏的便携式组件。您绝对需要知道指针和内存分配如何工作,然后才能完成任何操作:)
btw。,恭喜您开始学习C,这将为您提供有关计算机和编程语言的性质的很多很好的见解:)
关闭,
如果用户输入带有30个字符的字符串,则应注意的大小应为 30。
c中的字符串是无效的,因此您需要为终端字符(' 0')保留空间。您可以将字符串或字符串的长度交替存储,但是您需要确定最大表达字符的数量。
最简单的是使用strdup()分配足够的空间为字符串和零终端分配。
if( entry.note ) free(entry.note); //avoid leaking memory
entry.note = strdup(tempNote);
或者您可以使用包含长度和数据的结构,分配,分配和释放以下内容,
typedef struct {
unsigned short int len;
char str[1];
} strwlen_t;
strwlen_t* string_withlen_alloc(unsigned short int size) {
strwlen_t* p = malloc( size + sizeof(strwlen_t) );
p->str[0] = ' ';
p->len = 0;
return p;
}
strwlen_t* strwlen_dup(char* str) {
unsigned short int len = strlen(str);
strwlen_t* p = malloc( len + sizeof(strwlen_t) );
memcpy(p->str,str);
p->len = len;
return p;
}
void strwlen_free(strwlen_t* p) {
free(p);
}
strwlen_t* strwlen_cpy(strwlen_t* dp,char* sp) {
strcpy(dp->str,sp);
dp->len = len(sp);
return(dp);
}
声明您的条目结构,
struct Entries {
char name[50];
char phoneNumber[11];
strwlen_t* note;
} Entries;
然后您可以使用
if( entry.note ) free(entry.note);
entry.note = strwlen_dup(tempNote);
和打印条目。请注意,
printf("note: %sn",entry.note.str);