#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 : ฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬฬ๑ป ๚
Мои вопросы:
- Почему текстовая переменная в функции main и в
abc
функции не совпадает? - Я пытаюсь изменить использование
scanf
вabc
функции, и это работает! есть то же самое. Почему? - Как изменить код, чтобы заставить его работать. Я имею в виду из вопроса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 .