LINUX.ORG.RU

Ответ на: комментарий от Artificial_Thought

Artificial_Thought> Строка — это массив.

А, уже понял. Найду длину - найду последний символ. Всем спасибо за ответы.

vurdalak ★★★★★
() автор топика
Ответ на: комментарий от vurdalak

Тогда посмотри по лекциям за 1 курс:
1) Что обычно из себя представляет «строка» на Си.
1.1) Чем она заканчивается.
3) Алгоритм линейного поиска.

Факультативно:
Стандартная библиотека Си.

anonymous
()
Ответ на: комментарий от Artificial_Thought

Artificial_Thought> Массив постоянной длины.

И как тогда ее изменить? Мне же нужно сделать на 1 символ меньше.

vurdalak ★★★★★
() автор топика
Ответ на: комментарий от vurdalak

> И как тогда ее изменить? Мне же нужно сделать на 1 символ меньше.

tip: строка заканчивается \0

aho
()
Ответ на: комментарий от Fawkes

Конечно же просто *pos = 0, питоновские срезы строк переклинили меня.

PoMbl4
()
Ответ на: комментарий от Artificial_Thought

Artificial_Thought> А если в строке не будет '\n'?

То будет плохо. Но пока код и так костыльный, полировать буду позже, когда хоть как-то заработает.

vurdalak ★★★★★
() автор топика
Ответ на: комментарий от vurdalak

if ( str[strlen(str)- 1] == '\n') str[strlen(str) - 1]='\0';

Студент помог студенту =) В каком институте и на каком курсе не знают такие вещи?

Dikar ★★
()
Ответ на: комментарий от Dikar

Dikar> В каком институте и на каком курсе не знают такие вещи?

В политехе на пятом :D Программирование закончилось на втором (или на первом, не помню).

vurdalak ★★★★★
() автор топика
Ответ на: комментарий от Dikar

>if ( str[strlen(str)- 1] == '\n') str[strlen(str) - 1]='\0';

Какой ужас. Мсье знает, что строка будет пройдена два раза, чтобы вычислить это выражение?

Dimanc ★★
()
Ответ на: комментарий от Dikar

Именно этот. А более интересный тут нельзя дать, элементарщина же.

Dimanc ★★
()
Ответ на: Вы всё ещё кипятите? Тогда мы идём к вам! от Deleted

P.S. Я не несу никакой ответственности за возможные тяжкие увечья, помутнение рассудка, массовые разрушения и другие катаклизмы, к которым может привести использование этого куска кода.

Deleted
()
Ответ на: комментарий от Dikar

> int pos=strlen(str)- 1;

if ( str[pos] == '\n')

str[pos]='\0';

если строка может быть нулевой длины, то

int len = strlen(s);
	if(len > 0)
		if(s[len-1] == '\n')
			s[len-1] = 0;

backbone ★★★★★
()
Ответ на: комментарий от Dimanc
int len = strlen(s);
   if (len && (s[len-1] == '\n'))
         s[len-1] = 0;

незя, т.к. не гарантировано, что разыменование len будет выполнено до (s[len-1] == '\n'), но в 99.9% случаев сработает...

backbone ★★★★★
()
Ответ на: комментарий от backbone

Зачёт! Самый быстрый, надежный и читаемый в мире код! (:

Dikar ★★
()
Ответ на: комментарий от backbone

>незя, т.к. не гарантировано, что разыменование len будет выполнено до (s[len-1] == '\n'), но в 99.9% случаев сработает...

Учи матчасть. Что такое «разыменование len» я не понял, но если len != 0, то следующее выражение гарантированно не будет вычисляться.

Dimanc ★★
()
Ответ на: комментарий от Dimanc

Читайте K&R, на x86[_64] подобное работает, а на другой архитектуре выражение в скобках может вычисляться справа налево.

Eddy_Em ☆☆☆☆☆
()

2 Eddy_Em
[quote]
Имеется соответствующая операция && для AND. Выражения, связанныеоперациями && или ||, рассматриваются слева на право, и при этомгарантируется, что оценивание выражений будет прекращено, как толькостанет ясно, является ли все выражение истинным или ложным. Так, если'c' оказывается пробелом, то нет никакой необходимости проверять,является ли 'c' символом новой строки или табуляции, и такие проверкидействительно не делаются. В данном случае это не имеет принципиальногозначения, но, как мы скоро увидим, в более сложных ситуациях этаособенность языка весьма существенна.
[/quote]

Я 20 минут потратил, чтобы это найти. В следующий раз проверяй что-нибудь прежде, чем сказать.

Dimanc ★★
()
Ответ на: комментарий от Dimanc

Зависит от компилятора, а также от оптимизаций.
Если нужно записать в одну строчку, можно так:

int len = strlen(str);
  if (len ? (str[len-1] == '\n') : 0)
  str[len-1] = 0;
да, вычисление выражения будет прекращено, но порядок вычисления может быть иным, что приведёт к чтению по адресу...

backbone ★★★★★
()
Ответ на: комментарий от backbone

>да, вычисление выражения будет прекращено, но порядок вычисления может быть иным

Ну вроде в КиР говорится именно о порядке вычисления... А ссылку можно на что-нибудь, где это оговаривается?

Dimanc ★★
()
Ответ на: комментарий от backbone

> Зависит от компилятора, а также от оптимизаций.

А можно пример такого компилятора+оптимизации, который вычисляет справа налево?

rival ★★
()
Ответ на: комментарий от rival

>А можно пример такого компилятора+оптимизации, который вычисляет справа налево?

А важнее даже не пример, а возможно ли такое согласно стандартам.

Dimanc ★★
()
Ответ на: комментарий от Dimanc

Ну вот 6.5.13 часть C99 гласит:
Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation;
there is a sequence point after the evaluation of the first operand. If the first operand
compares equal to 0, the second operand is not evaluated.

5.1.2.3:
Accessing a volatile object, modifying an object, modifying a file, or calling a function
that does any of those operations are all side effects,11) which are changes in the state of
the execution environment. Evaluation of an expression may produce side effects. At
certain specified points in the execution sequence called sequence points, all side effects
of previous evaluations shall be complete and no side effects of subsequent evaluations
shall have taken place. (A summary of the sequence points is given in annex C.)

Dimanc ★★
()
Ответ на: комментарий от backbone

Позор. Немедленно google: ISO 9899:1999 и читать до просветления.
Вот до чего доводит обучение по самоучителям и прочим туториалам.

geekless ★★
()
Ответ на: комментарий от Dimanc

Или так:[code] int len; (len = strlen(s)) && (s[len-1] == '\n') && (s[len-1] = 0); [/code]

geekless ★★
()
Ответ на: комментарий от geekless

>Вот до чего доводит обучение по самоучителям и прочим туториалам.

Нет, самообучение до этого не доводит. Видимо, он где-то что-то слышал и теперь думает, что оно так. И самое главное - он такой не один!

Dimanc ★★
()
Ответ на: комментарий от backbone
int len = strlen(str);
  if (len ? (str[len-1] == '\n') : 0)
  str[len-1] = 0;

Вот так и рождается код, который потом постят на code wtf и вспоминают индийских разработчиков.

geekless ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.