在函数中更新字符串数组 - C.

时间:2016-05-18 19:26:31

标签: c arrays string pointers

我正在编写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()程序时根本不起作用。

3 个答案:

答案 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);

取决于如何管理这两个对象的内存。如果没有看到你的其余代码,很难就此做出任何建议。