Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] работа с символьной строкой


Автор: alxdel 20.3.2012, 08:56
Имеется самописная функция, возвращающая указатель на символьный тип. Вопрос: почему, используя
функцию printf(), нельзя распечатать строку, на начало которой указывает результат самописной функции;
при этом почему вывод строки, на начало которой указывает глобальная переменная p, в отличие от предыдущей
ситуации, происходит без ошибок?

Код

#include <stdio.h>

char *strpart(char *str, ...);

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

    char *p="test";
    printf("%s ",strpart(argv[1], ...)); // тут строка не выводится
    printf("%s",p);                      // строка выводится
    return 0;
};

char *strpart(char *str, ...){
    ...
    char resultstr[count];
    for ( ;i<count;i++ ) resultstr[i]=str[i+1];
    return resultstr;
};

Автор: t_gran 20.3.2012, 09:23
Код

   char *p="test";

Так нельзя делать. Нужно
Код

    const char *p="test";


А по части ошибки, дело в том, что вы объявили массив внутри функции. Что будет с массивом после выполнения функции? Правильно, освобождение памяти. Т.е. вы возвращаете указатель на массив, память из под которого уже освобождена.

Автор: alxdel 20.3.2012, 10:17
Цитата(t_gran @ 20.3.2012,  09:23)
Что будет с массивом после выполнения функции? Правильно, освобождение памяти. Т.е. вы возвращаете указатель на массив, память из под которого уже освобождена.

Почему же тогда при замене

Код

printf("%s ",strpart(argv[1], ...)); // тут строка не выводится


на

Код

int i=0;
for ( ; strpart(argv[1], ...)[i] ; i++ ) printf("%c ", strpart(argv[1], ...)[i] );


все корректно выводится на печать?

Автор: NerdP 20.3.2012, 11:36
А что за идентификатор count в функции?

Автор: alxdel 20.3.2012, 11:45
Цитата(NerdP @ 20.3.2012,  11:36)
А что за идентификатор count в функции?

Размерность строкового массива resultstr[]. Объявление переменной count и её вычисление просто опущено ( ... ).

Автор: kapbepucm 22.3.2012, 16:14
Код
#include <stdio.h>

char *strpart(char *str);

int main(int argc, char *argv[])
{
  char *p="test";
  printf("%s\n",strpart(argv[1]));
  printf("%s\n",p);      
  return 0;
};

char *strpart(char *str)
{
  int i;
  static char resultstr[100];
  for (i=0 ;i<100;i++ ) resultstr[i]=str[i];
  return resultstr;
};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)