C语言编程中的删除结构 #包括 #包括 #包括 类型定义结构{ 字符系列计算器[45]; char tip_procesor[78]; 字符记忆[55]; 字符硬盘[60]; 字符监视器[65]; }计算器; 作废删除(计算器*ct,整数*dim,字符序列[45]) { int k=0,i,j; 对于(i=0;iSeries系列iSeries_计算器)==0) { k++; 对于(j=i;j
在该函数中C语言编程中的删除结构 #包括 #包括 #包括 类型定义结构{ 字符系列计算器[45]; char tip_procesor[78]; 字符记忆[55]; 字符硬盘[60]; 字符监视器[65]; }计算器; 作废删除(计算器*ct,整数*dim,字符序列[45]) { int k=0,i,j; 对于(i=0;iSeries系列iSeries_计算器)==0) { k++; 对于(j=i;j,c,structure,C,Structure,在该函数中 #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(Ca
#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;
}
第一个参数的声明似乎类似于指向作为参数传递给函数的数组的第一个元素的指针
因此
将表示数组的第一个元素
ct[0]
将表示数组的第二个元素,依此类推
这张唱片
ct[1]
其中i是某个索引的等价项
ct[i]
所以这个声明
*( ct + i )
也可以这样写
*(ct + j) = ct[j + 1];
for (j = i;j < (*dim - k);j++)
*(ct + j) = ct[j + 1]; // <== This line here
至于函数本身,那么它是完全错误的
在这个循环中
ct[j] = ct[j + 1];
删除数组中的一个元素时,索引i
不应增加,否则将跳过删除元素后的下一个元素
我命名为likeremove\u all
的函数的正确实现如下所示。我简化了结构声明,因为结构的其他数据成员与函数实现无关
for (i = 0; i < (*dim) - k; i++)
^^^^^^^^^^^^^^
在代码中标记特殊行时,请使用注释。在代码块中格式不起作用。另外,请记住,对于任何指针或数组
p
和索引i
,表达式p[i]
和*(p+i)
都是相等的。现在我们来了解一下这一点,以及这对*(ct+j)之类的东西意味着什么=ct[j+1]
。我建议您首先将*(ct+j)
翻译为它的等价物ct[j]
。并学习如何使用调试器,然后您可以在监视变量及其值时逐行检查,以查看发生了什么。@Andrei Popescu这一行的作用并不重要,因为该函数整体无效。:)
for (j = i;j < (*dim - k);j++)
ct[j] = ct[j + 1]; // <== This line here
for (i = 0; i < (*dim) - k; i++)
^^^^^^^^^^^^^^
#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