我正在编写C函数,只有在给定元素是唯一的情况下才会更新字符串数组。我已经实现了这个功能:
char *cities[100];
/* adds 2 names if they're unique instances and updates total number of cities names
if necessary */
int addCity(char* city1, char* city2, char** arr, int amount) {
int toReturn = amount;
int i;
int flag1 = 0;
int flag2 = 0;
// checking whether first city already exists
for (i = 0; i < amount; i++ ) {
if (strcmp(arr[i], city1) == NULL) {
flag1 = 1;
break;
}
}
if (flag1 == 0) {
arr[amount] = city1;
toReturn++;
}
// 2nd city
for (i = 0; i < amount; i++ ) {
if (strcmp(arr[i], city2) == NULL) {
flag2 = 1;
break;
}
}
if (flag2 == 0 && flag1 == 1) {
arr[amount] = city2;
toReturn++;
}
if (flag2 == 0 && flag1 == 0) {
arr[amount+1] = city2;
toReturn++;
}
return toReturn;
}
在尝试比较String数组的元素和String本身时,看起来我得到一些警告(指针和整数之间的比较)。我怎么能摆脱它呢?总的来说,这个功能还有什么可以改进的呢?
另外,我怀疑arr [amount] = city1,但是当我使用strcpy()程序时根本不起作用。
答案 0 :(得分:2)
您需要的是以下
char *cities[100];
/* adds 2 names if they're unique instances and updates total number of cities names
if necessary */
int addCity( const char *city1, const char *city2, char **arr, int amount )
{
int i;
// checking whether first city already exists
i = 0;
while ( i < amount && strcmp( arr[i], city1 ) != 0 ) i++;
if ( i == amount )
{
arr[amount] = malloc( strlen( city1 ) + 1 );
if ( arr[amount] ) strcpy( arr[amount++], city1 );
}
// 2nd city
i = 0;
while ( i < amount && strcmp( arr[i], city2 ) != 0 ) i++;
if ( i == amount )
{
arr[amount] = malloc( strlen( city2 ) + 1 );
if ( arr[amount] ) strcpy( arr[amount++], city2 );
}
return amount;
}
至于你的代码,那么if语句中的这些条件
if (strcmp(arr[i], city1) == NULL)
if (strcmp(arr[i], city2) == NULL)
错了。应该有
if (strcmp(arr[i], city1) == 0)
if (strcmp(arr[i], city2) == 0)
此代码块之后
if (flag1 == 0) {
arr[amount] = city1;
toReturn++;
}
你还应该增加amount
,因为它在下面用作指针数组中的索引。
这两个条件
if (flag2 == 0 && flag1 == 1) {
if (flag2 == 0 && flag1 == 0) {
等同于条件
if (flag2 == 0) {
似乎你应该为每个增加的城市动态分配内存。
至于我,那么我将使用以下函数参数的顺序
int addCity( char **arr, int amount, const char *city1, const char *city2 );
甚至可以通过以下方式定义函数
int addCity( char **arr, int amount, const char *city )
{
int i;
// checking whether the city already exists
i = 0;
while ( i < amount && strcmp( arr[i], city ) != 0 ) i++;
if ( i == amount )
{
arr[amount] = malloc( strlen( city ) + 1 );
if ( arr[amount] ) strcpy( arr[amount++], city );
}
return amount;
}
并为每个增加的城市分别拨打两次。
答案 1 :(得分:1)
首先strcmp
返回一个整数。所以不要将它与NULL
进行比较。 NULL
是指针值。因此,请与0
进行比较。
if (strcmp(arr[i], city1) == 0)
但是,您的主要问题是将指针作为参数传递给cities
。这是一个主要问题,因为指针很快就会超出范围。
您需要分配内存然后执行strcpy
。类似的东西:
if (flag1 == 0) {
char* tmp = malloc(strlen(city) + 1); // add 1 for zero termination
strcpy(tmp, city);
arr[amount] = tmp;
toReturn++;
}
并且...完成后不要忘记free
记忆。
答案 2 :(得分:0)
if (strcmp(arr[i], city1) == NULL) {
应该是
if (strcmp(arr[i], city1) == 0 ) {
同样,使用
if (strcmp(arr[i], city2) == 0 ) {
是否应该使用
arr[amount] = city1;
或
strcpy(arr[amount], city1);
取决于如何管理这两个对象的内存。如果没有看到你的其余代码,很难就此做出任何建议。