gpt4 book ai didi

c - C语言中删除结构体

转载 作者:太空宇宙 更新时间:2023-11-04 03:25:17 25 4
gpt4 key购买 nike

#include <stdio.h>
#include <conio.h>
#include <string.h>

typedef struct {
char serie_calculator[45];
char tip_procesor[78];
char memorie[55];
char hdd[60];
char monitor[65];
}Calculator;

void deleting(Calculator *ct, int *dim, char serie[45])
{
int k = 0, i, j;
for (i = 0;i<(*dim);i++)
if (strcmp((ct + i)->serie_calculator, serie) == 0)
{
k++;
for (j = i;j < (*dim - k);j++)

*(ct + j) = ct[j + 1]; // <== This line here

}
*dim = *dim - k;
}

deleting 函数中,我不明白这行:*(ct + j) = ct[j + 1]; 的作用。有人可以帮忙吗?我希望你能理解这个函数,因为这只是整个程序的一个序列。

最佳答案

在这个函数中

void deleting(Calculator *ct, int *dim, char serie[45])

似乎第一个参数被声明为指向作为参数传递给函数的数组第一个元素的指针。

因此

ct[0]

将表示数组的第一个元素

ct[1]

将表示数组的第二个元素,依此类推。

这条记录

ct[i]

其中 i 是一些索引等同于

*( ct + i )

所以这个声明

*(ct + j) = ct[j + 1]; 

也可以这样写

ct[j] = ct[j + 1]; 

至于函数本身则完全错误。

在这个循环中

        for (j = i;j < (*dim - k);j++)

*(ct + j) = ct[j + 1]; // <== This line here

据说也可以这样写

        for (j = i;j < (*dim - k);j++)

ct[j] = ct[j + 1]; // <== This line here

当 j 等于 *dim - 1 时尝试写入数组之外,因为表达式 j + 1 在这种情况下将等于 *dim 虽然索引的有效范围是 [0, *dim - 1]

此外,外循环中的条件也至少应该看起来像

for (i = 0; i < (*dim) - k; i++)
^^^^^^^^^^^^^^

和索引i 不应在删除数组元素时增加。否则将跳过删除元素之后的下一个元素。

我命名为 remove_all 的函数的正确实现如下面的演示程序所示。我简化了结构声明,因为结构的其他数据成员与函数实现无关。

#include <stdio.h>
#include <string.h>

typedef struct
{
char serie_calculator[45];
// ...
} Calculator;

size_t remove_all( Calculator c[], size_t n, const char *s )
{
size_t i = 0;

for ( size_t j = 0; j < n; j++ )
{
if ( !( strcmp( c[j].serie_calculator, s ) == 0 ) )
{
if ( i != j ) c[i] = c[j];
++i;
}
}

return i;
}

int main(void)
{
Calculator c[] = { { "A" }, { "B" }, { "C" }, { "A" }, { "D" }, { "E" }, { "A" } };
const size_t N = sizeof( c ) / sizeof( *c );

for ( size_t i = 0; i < N; i++ ) printf( "%s ", c[i].serie_calculator );
printf( "\n" );

size_t n = remove_all( c, N, "A" );

for ( size_t i = 0; i < n; i++ ) printf( "%s ", c[i].serie_calculator );
printf( "\n" );

return 0;
}

程序输出为

A B C A D E A 
B C D E

关于c - C语言中删除结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41691810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com