LINUX.ORG.RU

сравнение строк


0

1
fgets(buf,sizeof(buf),stdin);
if(buf[strlen(buf)-1]=='\n'){
                            buf[strlen(buf)-1]='\0';
                            }

FILE* f=fopen(dir, "r");
fgets(op,100,f);
fclose(f);
if(op[strlen(op)-1]=='\n'){
                          op[strlen(op)-1]='\0';
                           }

for(g=0;g<strlen(op);g++){

             if(op[g]==' '){
                           y=strlen(op)-g;
                           for(z=0;z<y;z++){
                                       x[z]=op[g+1];
                  вны                      g++;
                                                    }
                           }
              else continue;
                  for(z=0;z<strlen(x);z++){
                                            printf("%c",x[z]);
                                           }
                  break;
                  }


 if(x[strlen(x)-1]=='\n'){
                          x[strlen(x)-1]='\0';
                         }

if(strcmp(x,buf)==NULL){
                       printf("равны");
                       }
else{printf("не равны");}

помогите сравнить слова , первое вводится с клавиатуры , второе считывается с файла после первого пробела и является концом строки


Кстати, с файла вы можете считывать строки при помощи getline, а самый последний пробел искать при помощи strrchr.

Eddy_Em ☆☆☆☆☆
()

Извиняюсь, а мне одному все это, особенно стиль, показалось быдлокодом?

По сабжу - с файла читай с помощью getline(). Дальше не осилил разобрать, нечитабельно ИМХО.

Общая стратегия, примерно - взял две строки, и начал из сравнивать посимвольно, начиная с первого, как только различие появилось - покзываешь мессагу о несовпадении.

Zhbert ★★★★★
()

Без слез смотреть нельзя. Если не работает, то в первую очередь из-за:

вны g++;

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

«вны» - это уже порча памяти пошла =)

Кажется, эта куча strlen убила один нейрон моего мозга =(

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

очередная школота на любимом лоре, как же вы задолбали!

выучите сначала C, потом C++, а уж потом беритесь за Qt

вот нахрена он нужен, если есть strcmp, strncmp, наконец std::string в плюсах?

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

qstring позволяет избежать глупых ошибок при работе со строками, содержит все методы по обработки строк внутри себя, обеспечивает implicit sharing и т.д. и т.п.

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

Извиняюсь, а мне одному все это, особенно стиль, показалось быдлокодом?

Нет, всё правильно вам показалось.

2suv121: strcmp() никогда не возвращает NULL. Код возврата от ф-ций нужно проверять, а код форматировать. Это как минимум. Глубже не смотрел.

php-coder ★★★★★
()

Мои глаза... Надо так

if(x[strlen(x)-1]=='\n')
{
    x[strlen(x)-1]='\0';
}
или так
 if(x[strlen(x)-1]=='\n'){
    x[strlen(x)-1]='\0';
 }

А у тебя писец какой-то

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

> обычно он(.NET) уже есть в самой популярной ОС.

fixed же.

и он тоже внезапно позволяет сравнивать строки. почему бы не воспользоваться им?

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

Может быть тогда возьмешся переписать стандартные консольные никс-тулзы на Qt?

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

Как правило это считается хорошим стилем т.к. сразу видно что речь идет о завершающем нуле в строке. А экономить на нажатии клавиш нужно с умом.

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

Можно подумать, без qt задача из топика не реализуема ;)

anon_666
()
Ответ на: комментарий от Eddy_Em
FILE* f=fopen(dir, "r");
for(y=0; y<2; y++){
               fscanf(f,"%c",op);

                  }

for(y=0;y<strlen(op);y++){
                         printf("%c",op[y]);
                         }

так считает второе слово из файла? и почему когда вместо %c ставлю %s выдает ошибку сегментации

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

А тут-то вам что не нравится? strlen вычисляется один раз, если fgets «съел» перевод строки, то перевод обрубается...

suv121

так считает второе слово из файла?

Я про strrchr выше уже говорил. А еще есть strtoc и strstr. А приведенный вами код выполняет черт знает что...

И да, если делаете fscanf (чего я вам не рекомендую), то чтобы занести считанное в переменную, нужно указать ее адрес, т.е.

fscanf(f, "%s", &buf);

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от suv121

Да почитайте же вы мануал, наконец-то:

strchr ищет первое вхождение символа в строку

strrchr ищет последнее вхождение символа в строку

strtok разбивает строку на токены по определенному разделителю

strstr ищет в строке подстроку

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от suv121

Да, нажмите внизу кнопку «показать удаленные комментарии» и посмотрите: я уже приводил пример с strrchr и strstr.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от cydwic

.NET не соответствует тому, на каком языке ТС пытается изначально решить задачу

консольные никс-тулзы писаны не неучами, подобно ТС, потому переписывать сейчас их на qt нет необходимости

да, без qt задача реализуема, но ТС не сообщил цель задачи: если он хочет обучиться языку, то ему еще многое стоит почитать (для начала как код форматировать); если же он и далее хочет использовать char* строки в своих программах и\или реализовать функциональность других классов qt то он безумец

x905 ★★★★★
()

>Сообщение удалено catap по причине '4.1 Offtopic (-5)'

Ну и где тут оффтопик? Модератор считает что пользователи ЛОРа должны разбирать этот п*ц, и не могут высказать автору мнение о его коде?

congestion_control
()

На C не пишу, ибо школота и быдлокодер, но таки вот:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *argv[]) {
  if (argc != 2) {
    fprintf(stderr, "Usage: %s FILE\n", argv[0]);
    return 0;
  }

  errno = 0;
  FILE *file = fopen(argv[1], "r");
  if (file == NULL) {
    fprintf(stderr, "%s: %s\n", argv[1], strerror(errno));
    return errno;
  }

  char *needle = NULL;
  char *highstack = NULL;
  size_t hlen, nlen;

  while (1) {
    hlen = getline(&highstack, &hlen, file);
    if (hlen == -1) {
      fprintf(stderr, "couldn't get line from '%s' file\n", argv[1]);
      break;
    }
    highstack[hlen - 1] = '\0';

    nlen = getline(&needle, &nlen, stdin);
    if (nlen == -1) {
      fprintf(stderr, "couldn't get line from stdin\n");
      break;
    }
    needle[nlen - 1] = '\0';

    const char *sep = " \t";
    char *begin = strpbrk(highstack, sep);
    if (begin == NULL) {
      break;
    }
    begin++;

    char *end = strpbrk(begin, sep);
    if (end == NULL) {
      end = highstack + hlen - 1;
    }

    if (end - begin != nlen - 1) {
      puts("size doesn't match");
      break;
    }

    printf("cmp: %d\n", strncmp(begin, needle, end - begin));
    break;
  }
  
  fclose(file);
  free(needle);
  free(highstack);

  return 0;
}

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

& не нужен , это указательна первый элемент массива

suv121
() автор топика

> вны g++;

Вот тебе todo list:

1) Прочитать про Coding Style 2) Начать думать над задачами и решать свои задания самому, это просто. 3) ??? 4) Профит

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

> очередная школота на любимом лоре, как же вы задолбали!

Школьники лезут всюду. Жалко, что лезут с такими просьбами. Вот люди и сваливают, как сваливали с programming@c.j.ru

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

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

А тут-то вам что не нравится? strlen вычисляется один раз, если fgets «съел» перевод строки, то перевод обрубается...

Мне не нравится попытка запихнуть много всего в одну строку:

x[ l=(strlen(x)-1) ]

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