Erebus_22 Ответов: 4

Программа резко останавливается


#include<stdio.h>
#include<string.h>
main()
{
	char* newme(char* input1);
	char* newi;
	strcpy(newi,newme("platue..."));
	return 0;
}
char* newme(char* input1)

{
float p=22.9999,w=99.83234,r=333.523422;
	sprintf(input1," %.2f,%.2f,%.2f",p,w,r);
	printf("%s",input1);
	return input1;
}

Программа запускается на компиляторе Dev C++, и каждый раз при ее запуске я получаю сообщение о том, что программа перестала работать.

Что я уже пробовал:

я попытался изменить код, но функция должна возвращать строку, это единственная проблема.

4 Ответов

Рейтинг:
2

Richard MacCutchan

Вы вызываете функцию newme передача указателя на постоянную строку ("platue..."). Затем эта функция пытается записать в эту строку с помощью sprintf и таким образом терпит неудачу. Вам нужно создать буфер, достаточно большой, чтобы вместить возвращаемую строку и передать ее или выделить внутри буфера. newme функция и возвращает ее указатель вызывающему объекту. Вам также необходимо выделить буфер для newi перед вашим звонком в strcpy.


Рейтинг:
1

OriginalGriff

Здесь есть масса проблем.
Вы передаете постоянную строку функции, а затем пытаетесь записать в нее. Это не позволено, так же как я не могу изменить твое собственное имя, написав мое поверх твоего свидетельства о рождении!
Это происходит потому, что вы объявляете указатель на символьную переменную с именем newi но вы совсем не придаете этому значения. Поэтому, когда вы пытаетесь скопировать строку, которую функция возвращает в нее, ей некуда ее поместить.

Попробовать это:

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

char* newme(char* input1);
int main()
{
    char data[100];
	char newi[100];
	strcpy(newi,newme(data));
	return 0;
}
char* newme(char* input1)
 
{
float p=22.9999,w=99.83234,r=333.523422;
	sprintf(input1," %.2f,%.2f,%.2f",p,w,r);
	printf("%s",input1);
	return input1;
}

Это должно работать лучше.


Рейтинг:
0

CPallini

Цитата:
strcpy(newi, newme ("platue..."));
Перед вызовом strcpy, newi должен указывать на допустимый выделенный буфер (см. strcpy-ссылка на C++ [^] для получения полной информации).


Цитата:
функции sprintf(вход 1," %.2-ой этаж,%.2-ой этаж,%.2Ф",р,ж,р);
Здесь вы пытаетесь написать поверх буфера только для чтения (input1="platue...").


Я предлагаю вам прочитать хороший учебник по C указатели и строки.


Рейтинг:
0

Patrice T

Вот ссылки на справочники книг по С и с++ авторов этих языков. Обратите внимание, что C является предком C++, поэтому знание C всегда полезно с C++.
Язык программирования Си - Википедия, свободная энциклопедия[^]
https://hassanolity.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~ПФ/Керниган-Ритчи/с-Программирование-электронные книги.формат PDF[^]

Язык Программирования C++ [^]

Желаю вам хорошей лекции, если она вам нужна.