Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Rexer
166 / 165 / 46
Регистрация: 10.10.2010
Сообщений: 725
1

Указатели - разобрать код и причину его неработоспособности

09.03.2012, 13:40. Просмотров 569. Ответов 7
Метки нет (Все метки)

Всем привет!
Возможно,вопрос глупый,но я не могу разобраться,а спросить некого,так как изучаю сам.
Упражнение из книги Кернигана и Ритчи.
Пишем функцию strcat()
C
1
2
3
4
5
6
7
void strcat(char *s, char *t)
{
    while(*s)
        s++;
    while(*s++ = *t++)
        ;
}
Так работает,но если сделать вот так,то уже не получается
C
1
2
3
4
5
6
7
void strcat(char *s, char *t)
{
    while(*s++)
        ;
    while(*s++ = *t++)
        ;
}
В связи с этим мне не понятно,почему второй вариант не рабочий?
Пока не ноль идем по строке же,просто более короче записали первый!
Заранее спасибо!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2012, 13:40
Ответы с готовыми решениями:

Объясните причину неработоспособности кода
<!doctype html> <meta charset="utf-8"> <style> body {background-color: rgb(197, 207, 223);}...

For each с массивом символов - выяснить причину неработоспособности приведенного кода
Компилятор ругается на примерно такой код: void foo(char cArray) { for each (char c in cArray)...

Указатели: разобрать небольшой код
Есть вот такой кусочек кода: int ** pt; int arr; pt = arr; Почему использование конструкции...

Как заполнить двумерный массив из stringGrig, используя указатели. Разобрать код
Здравствуте, у меня возникли некоторые вопросы о указтелях и двумерных массивах. Буду признателен,...

7
soon
2551 / 1316 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.03.2012, 13:43 2
На последней итерации s выйдет за ноль. Так что некорректная замена
1
Rexer
166 / 165 / 46
Регистрация: 10.10.2010
Сообщений: 725
09.03.2012, 15:57  [ТС] 3
Спасибо,тогда еще вопрос,функция strcpy()
C
1
2
3
4
5
void strcpy3(char *s, char *t)
{
    while(*s++ = *t++)
        ;
}
Здесь получается тоже выход за ноль-символ?Но так как мы все скопировали нам не важно уже это,да?
Прав ли я и если не прав,то где ошибка в рассуждениях?
0
soon
2551 / 1316 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.03.2012, 16:17 4
Цитата Сообщение от Rexer Посмотреть сообщение
Здесь получается тоже выход за ноль-символ?Но так как мы все скопировали нам не важно уже это,да?
Всего лишь на один символ. Да, это уже не важно.

Если вдруг непонятно, по какому принципу этот цикл завершается, то вот простенький пример
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main()
{
    int a;
    if(a = 0)
        printf("1\n");
    else
        printf("0\n");
    return 0;
}
1
Rexer
166 / 165 / 46
Регистрация: 10.10.2010
Сообщений: 725
09.03.2012, 23:17  [ТС] 5
Стоп.
Тут мы в условии же инициализируем а нулем,проверяем условие,оно оказывается ложным и мы выходим по ветке else и выводим 0.
А цикл то заканчивается потому,что мы натыкаемся на нуль-символ и условие становится ложным,разве нет?
В чем связь?
Большое Вам спасибо за помощь!
0
soon
2551 / 1316 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.03.2012, 05:08 6
Rexer, После присваивания возвращается левый операнд, именно это я и хотел показать. Да, мы натыкаемся на нуль терминанту, и т.к. в int представлении \0 = 0, то цикл завершается.
1
Rexer
166 / 165 / 46
Регистрация: 10.10.2010
Сообщений: 725
10.03.2012, 13:00  [ТС] 7
Вот еще вопрос.
Пишем функцию сравнения
Получаем два указателя,правильно ли я понимаю,что сначала мы приводим указатель к указателю на Int,а далее этот указатель просто разыменовываем и разность нам как раз показывает кто из двух элементов больше или меньше?
C
1
2
3
4
int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}
Полный пример
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
 
int values[] = { 40, 10, 100, 90, 20, 25 };
 
int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}
 
int main ()
{
  int n;
  qsort (values, 6, sizeof(int), compare);
  for (n=0; n<6; n++)
     printf ("%d ",values[n]);
  return 0;
}
0
soon
2551 / 1316 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.03.2012, 13:04 8
Цитата Сообщение от Rexer Посмотреть сообщение
Получаем два указателя,правильно ли я понимаю,что сначала мы приводим указатель к указателю на Int,а далее этот указатель просто разыменовываем и разность нам как раз показывает кто из двух элементов больше или меньше?
Да, все верно
1
10.03.2012, 13:04
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2012, 13:04

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Разобрать код и объяснить его функционал
data A ds B ds R ds CT1 ds CH ds CT2 ds code:...

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

Разобрать приведенный код и объяснить его назначение
объясните, что делает этот метод static string NewMas(ref int i, int indexdel, int mas, ref...

Подробно разобрать приведенный код и его назначение
Добрый день! Помогите пожалуйста разобрать простенький код: string str1 =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.