Member 13846047 Ответов: 3

Вопрос состоит в том, чтобы взять две текстовые строки в качестве аргументов и вывести "true", за которым следует новая строка, если вторая строка полностью содержится в первой, или "false"


#include <stdio.h>
#include <string.h>
int main(int argc, char **argv){
  char *str1, *str2;
  int str1len, str2len; 

  str1 = argv[1]; str2 = argv[2];
  str1len=strlen(str1);
  str2len=strlen(str2);
  if (str2len>str1len){
    printf("false\n");
    return 0;
  }
  char sub1[100];
  for (int i=0;i<str1len-str2len;i++){
    strncpy(sub1,str1+i,str2len);
    if (strcmp(sub1,str2)==0){
      printf("true\n");
      return 0;
    }
  }
  printf("false\n");
  return 0;
}

What I have tried:

my code works correctly in all cases except when I have something like this: 'beautiful' 'bea' the result should be false but it gives me true. so generally if the second argument is contained within a word of the first argument, it returns true, although it should return false.

3 Ответов

Рейтинг:
2

OriginalGriff

Первое, что нужно заметить, это то, что технически можно утверждать, что "bea" полностью содержится в "beautiful" в том смысле, что все буквы находятся там последовательно и рядом друг с другом: я ожидал бы найти "true" для этого.
И когда я запускаю ваш код с "beautiful" и "bea", я получаю false в любом случае...
Как я делаю для "красивых" и "eau", что неправильно, и для "красивых" и "aut", но не для "красивых" и "auti", которые возвращают истину.

Этот код-плохой способ сделать это: вы копируете много информации только для того, чтобы использовать стандартные функции, и это часть вашей проблемы. Прочтите определение понятия strncpy[^] а затем подумайте о том, что он помещает в ваш буфер sub1, и что strcmp[^] собирается сделать с этим.

Это ваше домашнее задание: хотя я бы не стал делать его так (это очень неэффективно), это также t=ваша задача заставить его работать. Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

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

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!

Да, и сделай себе одолжение: сделай отступ в своем коде! Он становится намного более читабельным, и с ним легче работать, если вы это сделаете...

#include <stdio.h>
#include <string.h>
int
main (int argc, char **argv)
{
  char *str1, *str2;
  int str1len, str2len;
  str1 = argv[1];
  str2 = argv[2];
  str1len = strlen (str1);
  str2len = strlen (str2);
  if (str2len > str1len)
    {
      printf ("false\n");
      return 0;
    }
  char sub1[100];
  for (int i = 0; i < str1len - str2len; i++)
    {
      strncpy (sub1, str1 + i, str2len);
      if (strcmp (sub1, str2) == 0)
	{
	  printf ("true\n");
	  return 0;
	}
    }
  printf ("false\n");
  return 0;
}
Понимаете, что я имею в виду?


Рейтинг:
2

Arthur V. Ratz

Вот как это делается:

#include "stdafx.h"

#include <stdio.h>
#include <conio.h>
#include <string.h>

void print_true_if_exists(const char* str1, const char* str2)
{
	bool found = false;
	for (int pos = 0; str1[pos] != '\0' && !found; pos++)
	{
		int i = pos, t = 0; double rel = .0;
		while (str1[i] != '\0' && str2[t] != '\0')
			rel += (str1[i++] == str2[t++]) ? 1 / (double)strlen(str2) : 0;

		if (rel == 1) { printf("result: \"true\" string 2 is found at pos %d", pos); found = true; }
	}

	if (found == false)
		printf("result: \"false\" string 2 is not found...");
}

int main(int argc, char* argv[])
{
	char str1[256] = "red green blue pink white grey", str2[256] = "pink\0";

	print_true_if_exists(str1, str2);

	_getch();

    return 0;
}


Рейтинг:
2

KarstenK

Я бы использовал функции strtok чтобы разделить длинную строку на части и затем сделать сравнение.