Функция, которая ищет разницу между членами массива - PullRequest
1 голос
/ 25 мая 2011

Мне нужно написать функцию, которая будет возвращать true, если обнаружит разницу между членами массива.

Мой код:

int func1(int  *str)
{
    int i;
    for(i=0;i<*(str+i);i++) {
        if(*(str+i) == *(str+i+1))
        {
            return 1;
        }
    }
    return 0;
}

Я должен реализовать это с помощью указателей.

Код выше не работает (логически).

Кто-нибудь может помочь?

UPDATE:

Я изменил свой код на следующее:

int func1(int  *str)
{
    int i,temp=0;
    for(i=0;i<10-1;i++) {
        if(*(str+i) == *(str+i+1))
        {
            temp++;
            if( temp == 10 )
            {
                return 1;
            }
        }
    }
    return 0;
}

В чем проблема с новым кодом?

Ответы [ 3 ]

2 голосов
/ 25 мая 2011

Ваша функция принимает только один указатель массива, который кажется слишком малым для сравнения.

Вы должны добавить аргумент, который определяет длину массивов, или реализовать какую-то «политику», например, завершает массивы, используя определенное значение.

Вы также должны изучить использование стандартной функции <a href="http://linux.die.net/man/3/memcmp" rel="nofollow">memcmp()</a>.

2 голосов
/ 25 мая 2011

Это выглядит как домашнее задание для меня, поэтому я не хочу портить удовольствие, но одна вещь о C, которую я хотел бы упомянуть: наличие указателя на некоторый массив ничего не говорит вам о размере массива,Поэтому вашей функции потребуется указатель и второй аргумент size_t (или, возможно, указатель на последний элемент массива).

0 голосов
/ 25 мая 2011

Я не понимаю вопроса (неясно, чего вы пытаетесь достичь) ...

Как уже говорили другие, в вашем массиве нет проверки границ, что неправильно ...

Вот еще несколько отзывов о вашем коде:

// func1 - consider giving functions a meaningful name, it helps people to 
// understand what the function is supposed to be doing....
// In this instance, it might have been helpful to identify what the expected
// return values / inputs of the function are...
int func1(int  *str)
{
    int i;

    // Start a counter at 0, loop (adding 1) while 
    // the current value of the counter is less than, the value held in the 
    // array so, {1,2,3,4,0,7} Would terminate on the 0
    // This: {1,20,7,14,0,7} Would also terminate on the 0
    // This seems wrong, but again, it's unclear what you're trying to do here.
    for(i=0;i<*(str+i);i++) {

        // If the current element of the array
        // is the same as the next element of the array
        if(*(str+i) == *(str+i+1))
        {
            // return 1  - two numbers next to each other in the  
            //             array are the same?
            return 1;
        }
    }

    // Either:  The array contained a digit less than the counter,
    // Or: It didn't contain two numbers that were the same next to each other.
    // This seems a bit wrong?!?
    return 0;
}

Ваш вопрос может быть улучшен (чтобы получить более полезный ответ), если вы показали, какие входные данные вы ожидали получить, какие возвращаемые значения.

На основании этого «мне нужно написать функцию, которая будет возвращать true, если найдена разница между членами массива.»

В псевдокоде кажется, что вы захотите:

// Loop, checking we don't overflow.  No point checking the last element as
// there's nothing after it to check...
for (count = 0 to arraysize -1) {
    // If the current element != the next element, we've found a difference?!?
    if(arrayElement[count] != arrayElement[count+1) {
        return true
    }
}
return false

ОБНОВЛЕНИЕ:

В вашем новом коде ...

// You're still assuming the size of 'str'
int func1(int  *str) 
{     
    int i,temp=0;
    // Loop while i < 9, i.e. 9 times.
    for(i=0;i<10-1;i++) {         
        if(*(str+i) == *(str+i+1))         
        {
            temp++;             
            // Temp can never == 10, you're only going round the loop 9 times...
            // Maybe it should be (temp == 10-1), but I don't know where the 
            // 10 comes from...
            if( temp == 10 )
            {
                return 1;             
            }
        }     
    }     
    return 0; 
} 

Это:

if(*(str+i) == *(str+i+1))         
{
    temp++;             
    // Temp can never == 10, you're only going round the loop 9 times...
    if( temp == 10 )
    {
        return 1;             
    }
}     

Может быть:

// return 0 (FALSE) on first difference
if(*(str+i) != *(str+i+1))         
{
    return 0;             
}     

Если вы изменили return 0 в конце вашей функции на return 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...