@Vizik

Почему не удается передать строковой литерал в функцию, принимающую char*?

Код:
#include <iostream>
using namespace std;

char *get_substr(char *sub, char *str);

int main() {
	setlocale(LC_ALL, "RUS");
	char * substr;

	substr = get_substr("один", "два три четыре");
	cout << "Подстрока найдена: " << substr;

	return 0;
}

char *get_substr(char *sub, char *str) {
	int t;
	char *p, *p2, *start;
	
	for(t = 0; str[t]; t++) {
		p = &str[t];
		start = p;
		p2 = sub;
		while (*p2 && *p2 == *p) {
			p++;
			p2++;
		}
		if (!*p2)
		return start;
	}
	
	return 0;
}
  • Вопрос задан
  • 199 просмотров
Решения вопроса 2
@MarkusD Куратор тега C++
все время мелю чепуху :)
Все дело в том, что строковой литерал в C++ имеет константный тип.
Когда ты делаешь вызов get_substr("один", "два три четыре"), ты в функцию передаешь два строковых литерала, тип которых - const char[ N ], где N - это длина строки литерала включая терминальный символ '\0'.
Неявное преобразование типа из const char* в char* недопустимо, поэтому компилятор и пишет тебе ошибку.

На самом деле, тебе в твоем тексте char* вообще не нужен, т.к. полностью все операции у тебя не приводят к изменению состояния строки. Заменить char* на const char* будет и логичнее, и понимаемость кода тоже улучшит.
Ответ написан
Комментировать
myjcom
@myjcom Куратор тега C++
А еще сто раз говорили, что копипаста это зло.
Надо разорвать этот порочный круг.

Копирайт
The C programming language 1978 Kerninghan, Brian W.
#include <stdio.h>

int index(char[], char[]);

int main()
{
  char* str = "foo bar baz";
  char* str2 = "barz";
  
  if(index(str, str2) != -1)
    printf("found");
  else
    printf("not found");
  return 0;
}

int index(char s[], char t[])
{
  int i, j, k;
  for (i = 0; s[i] != '\0'; i++)
  {
    for (j = i, k = 0; t[k] != '\0' && s[k] == t[k]; j++, k++)
      ;
    if(t[k] == '\0')
      return i;
  }
  return -1;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
08 мая 2024, в 13:52
1500 руб./за проект
08 мая 2024, в 13:41
2000 руб./за проект