如何在 C 中更改结构属性的大小?

  • 本文关键字:属性 结构 c malloc realloc
  • 更新时间 :
  • 英文 :


我在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);

相关内容

  • 没有找到相关文章

最新更新