LINUX.ORG.RU

Си


2

4
#include <stdlib.h>
#include <stdio.h> 

int main(int argc, char *argv[]) {

char *num = «5555»; 	
	
	if (argc != 2) {
	printf(«No param\n»);
		exit(0);
	}
	
	if (argv[1] != num) {
	printf(«Fail num %s\n»,num);
	printf(«Fail arg %s\n»,argv[1]);
		exit(0);
	}

...
}

Подскажите, почему сравниваются два одинаковых значения, но определяются, как - неодинаковые!

Вывод программы:

Fail num 5555
Fail arg 5555

А в перле так можно. И я тоже наступал на эти грабли, думая - а как же строки сравнить, пока не научился #include <string.h>, strcmp();, да и начал с более простого - вместо лора погуглил обработку параметров си, а уже потом про указатели на указатели тут отписался, параллельно зазубривая их

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

Мне трех раз учебника по си прочитать хватило, точнее главу про указатели, чтобы почти понять как они работают. Дерзай

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

Почитай ещё про строки. Подумай. Повторять до наступления полного понимания

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

так там и пишут, что * получает значение!

А чьё значение, это там не написали? Ищи про массивы.

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

if (printf(&#34;%s&#34;,argv[1]) != printf(&#34;%s&#34;,num))

Мать моя, женщина!

А не бывает man printf прочесть, чтобы понять, что возвращает эта функция?

if ((*argv[1])) != (*num))

А что, надо в строке сравнивать только первые символы? А остальные — пофиг???

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

Я тут на быдлохабре автору некоей PVS-studio сказал, что -Wall -Werror спасут от 99% случаев, в которых его «студия» используется, мягко намекнув на ненужность сего продукта. А он обиделся и начал что-то доказывать.

привыкай. Таких пограммистов 95%.

emulek
()
Ответ на: комментарий от tailgunner

В чем мне признаваться? Я изучал компы с архитектуры CPU и маш.кодов, мне признаваться не в чем. Пусть признаются всякие перлисты и прочие жертвы басика.

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

Кстати, работает и так: if (printf(«%s»,argv[1]) != printf(«%s»,num))

кстати так «попа» == «пися». Фишка в том, что printf возвращает число символов (в данном случае наверное 8).

читай man 3 printf

Return value Upon successful return, these functions return the number of characters printed (excluding the null byte used to end output to strings).

а да, что-бы не выводить, юзай fprintf(/dev/null, «бла-бла-бла»);

Изучаю язык, поэтому прошу не оскорблять. Если вопросы кажутся «тупыми» - просьба промолчать .... Еще вопрос по указателям: по идее должно быть равно так: if ((*argv[1])) != (*num))

так можно. Только сравнивается первый БАЙТ строки (будь внимателен, в букве «ф» два байта!)

И да, тебя я не оскорблял, тут и без тебя хватает, кому подсвечником по башке надобно :) А тебе не надо.

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

Да ладно, типичная ошибка начинающего, все так делали в своё время

Лютейшее 4.2.

под «все» он имел ввиду начинающих с BASIC, PHP, Python, etc.

emulek
()
Ответ на: комментарий от anonymus123

if (*argv[1]) != *num)

Так ты сравниваешь только заначения первых «ячеек» массива. Правильно было бы так:

int
cmp(char *a, char *b)
{
        while (*a && *b)
                if (*a++ != *b++)
                        return 1;
        return 0;
}

PS: но лучше так не делать, используй strcmp.

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

А не бывает man printf прочесть, чтобы понять, что возвращает эта функция?

нет. Оно его на man 1 printf выведет, а надо man 3 printf.

emulek
()
Ответ на: комментарий от PolarFox

Все свободны использовать любую кодировку, которую пожелают, до тех пор, пока эта кодировка — utf-8.

Эдди не свободен, у него прочные семейные узы с koi.

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

Я изучал компы с архитектуры CPU и маш.кодов

Эх, везёт же некоторым... А у нас: монохромный монитор, AT с 5-ти цолевыми флоппи и без hdd и GW-BASIC в блокнотике! Вот это я понимаю тяжёлое детство! =)

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

tl;dr: раньше возникало много новых подходов к программированию и использованию компьютеров вообще, индустрия эволюционировала, потому что область была новая и ничего толком заранее известно не было. А сейчас всё скатывается в догматизацию из-за того, что новых программистов учат старые программисты, которые считают свой подход единственно верным.

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

А нафига мне лишний геморрой? А с КОИ8 я просто пользуюсь strcmp, strlen и прочими простыми строковыми функциями. И знаю, что для строчки из 10 символов мне нужно выделить ровно 11 байт.

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

У меня просто память хорошая. И да, тогда я был пиэльщиком %)

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

КОИ8-Р хватит всем!

Это та кодировка, в которой в прошлом тысячелетии оставалось три с половиной сайта?

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

Да ладно? Пример в студию!

$ cat Test.java
public class Test {
  public static void main(String[] args) {
    Integer i = 5555;
    Integer j = 5555;
    System.out.println(i == j);
  }
}

$ java Test
false
Miguel ★★★★★
()
Ответ на: комментарий от Anon

А нафига юзерам (которые пользуются нормальными кодировками*) лишний геморрой с твоими программами?

* — список нормальных кодировок: utf-8.

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

А нафига юзерам (которые пользуются нормальными кодировками*) лишний геморрой с твоими программами?

Да мне насрать на этих костыльщиков.

Anon
()
Ответ на: комментарий от PolarFox

Если им понадобятся мои программы, будут пользоваться как миленькие!

// а вообще, я не так уж и сильно строки использую — только в CGI'шках, но там все ОК, сайты-то на КОИ8!

Anon
()
Ответ на: комментарий от PolarFox

I see what you did here.

Естественно. Я и не говорил, что с int-ами тоже так получится.

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

Ну и слава богу, а то шаблон немножко затрещал.

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