Строка C корректна в одной функции и сбрасывает мусор в другой

#c #string

#c #строка

Вопрос:

Это мой код

 #include <stdio.h>

void abc(char *text);

int main(void)
{
    char text[20];
    abc(text);
    printf("text in main : %sn",text);
    return 0;
}

void abc(char *text)
{
    text = "abc";
    printf("text in abc function : %sn",text);
}
  

И это вывод.

 text in abc function : abc
text in main : ฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬ๑ป ๚
  

Мои вопросы:

  1. Почему текстовая переменная в функции main и в abc функции не совпадает?
  2. Я пытаюсь изменить использование scanf в abc функции, и это работает! есть то же самое. Почему?
  3. Как изменить код, чтобы заставить его работать. Я имею в виду из вопроса1, что функция make main и функция abc одинаковы?

Ответ №1:

Когда вы вызываете функцию:

  abc(text);
  

text создается копия указателя, и этот указатель используется в функции abc() . Так что, когда вы говорите:

 text = "abc";
  

вы изменяете копию, а не ту, что вернулась в main .

Кроме того, вы вообще не можете назначать строки в C — вместо этого вы должны использовать библиотечные функции, такие как strcpy() . Чтобы ваш код заработал, вам необходимо изменить:

  text = "abc";
  

Для:

  strcpy( text, "abc" );
  

Комментарии:

1. Новичкам действительно легко ошибиться с указателями, они могут занять некоторое время, чтобы разобраться

2. Если у меня есть текстовый адрес в функции main, могу ли я изменить в функции abc (передать по ссылке)?

3. @Atom Опубликованный мной код изменит буфер в main — вы пробовали это?

Ответ №2:

Вы не можете просто printf("text in main : %sn",text); это не имеет значения в C, вы либо можете использовать функцию типа strcpy() , которая принимает каждый символ и организует их в строку! или обычный цикл for и запустите его по всему массиву и выведите элементы без пробела.

 int i;
for (i=0 ; i<strlength(text);i  )
{
    printf ("%d",text[i]);
}
  

Комментарии:

1. Я полагаю, что это strlen (), а не strlength для C (strlength — это C , я полагаю). Идентификатор формата %s, безусловно, будет работать с его примером, а %d покажет представление текста в формате ASCII[i], вы хотите, чтобы там был %c .