63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
1

Как пользоваться scanf для строк

08.06.2014, 18:02. Показов 12210. Ответов 31
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
хоть убей не могу понять как пользоваться scanf для строк, запарило одни ошибки выдает...

пишу:
C
1
2
char *str;
scanf("%s", str);
во первых если не написать char *str = ""; выдает ошибку "Run-Time Check Failure #3 - The variable 'Str' is being used without being initialized." нахера ее инициализировать это бред, так не должно быть имхо...

во вторых даже если написал, выдает при считывании ошибку "Необработанное исключение в "0x102ddd6f (msvcr100d.dll)" в "test.exe": 0xC0000005: Нарушение прав доступа при записи "0x0041573c"." тоже вообще не понятно с какого перепуга... запарился, вроде так просто и такой гемор... че за фигня хз...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2014, 18:02
Ответы с готовыми решениями:

Как пользоваться scanf и printf?
Ребят,расскажите пожалуйста как пользоваться scanf() и printf().Какие там типы бывают. Буду очень...

Как пользоваться с scanf, и чем отличается от cout
Знающие, подскажите как пользоваться с scanf, и чем отличается от cout. И чем лучше всего...

как пользоваться программатором для Whirlpool, раздобыл программатор, а как им пользоваться я не знаю
подскажите плиз

Как пользоваться указателями строк?
Задолбался уже с вычислением длины строки: eLen - это длина текста. Мне нужно добить эту длину...

31
71 / 45 / 24
Регистрация: 11.05.2014
Сообщений: 179
08.06.2014, 18:08 2
Указатель объявили, а память не выделили под строку.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
08.06.2014, 18:11  [ТС] 3
Цитата Сообщение от helper Посмотреть сообщение
Указатель объявили, а память не выделили под строку.
да не должна она выделяться !!! почему то всегда работала без выделения, а тут вдруг зачем то выделять, это бред !!! но даже если выделять, вон я сделал инициализацию, все равно ошибка, вы читайте весь пост...
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
08.06.2014, 18:12 4
Цитата Сообщение от GetHelp Посмотреть сообщение
во первых если не написать char *str = ""; выдает ошибку "Run-Time Check Failure #3 - The variable 'Str' is being used without being initialized." нахера ее инициализировать это бред, так не должно быть имхо...
во вторых даже если написал, выдает при считывании ошибку "Необработанное исключение в "0x102ddd6f (msvcr100d.dll)" в "test.exe": 0xC0000005: Нарушение прав доступа при записи "0x0041573c"." тоже вообще не понятно с какого перепуга... запарился, вроде так просто и такой гемор... че за фигня хз...
Осиль уже хоть какую-нибудь книжку по Си.

Добавлено через 28 секунд
Цитата Сообщение от GetHelp Посмотреть сообщение
вы читайте весь пост...
А ты почитай про работу с памятью в Си.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.06.2014, 18:14 5
GetHelp, а ты не задумывался куда строка должна сохраняться? А вариант с инициализацией "", это просто ................ (не матерных слов что бы описать это не нашел)
Сделай как говорит helper, нормально выдели память через malloc, calloc
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
08.06.2014, 18:26  [ТС] 6
Jewbacabra, почитайте гугл, НИГДЕ нет про выделение памяти для этого... везде так прямо считывают... чисто забиваете в гугл "си scanf" и читаете... и отвечаю у меня всегда это работало безо всяких выделений... в конце концов ОТКУДА Я ЗНАЮ СКОЛЬКО Я ВВЕДУ СИМВОЛОВ ??? вы об этом подумали? я наверное не даром объявляю указатель а не статический массив?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.06.2014, 18:39 7
GetHelp, приведи ссылку где написано, что надо делать так:
C
1
2
char *str;
scanf("%s", str);

Не по теме:

А вообще весь разговор с тобой напоминает следующее:
Пусть есть начинающий биатлонист, который научился неплохо проходить дистанцию, но со стрельбой всегда были проблемы. И обратился он к товарищам по опытнее, почему так происходит? Ему и отвечают: когда стреляешь ружье надо направлять в сторону мишени а не себе в ногу, сделай так и все будет нормально. Но он начинает все говорить: вы ничего не понимаете, целится в мишень не надо я всегда так делал...

И в результате этот биатлонист героически проходит n штрафных кругов с простреленными ногами, хотя этого можно было легко избежать

0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
08.06.2014, 18:47 8
Цитата Сообщение от GetHelp Посмотреть сообщение
почитайте гугл, НИГДЕ нет про выделение памяти для этого...
Потому что это считается очевидным, т.к. scanf не может присвоить адрес на считанную строку во внешнюю переменную.

Цитата Сообщение от GetHelp Посмотреть сообщение
в конце концов ОТКУДА Я ЗНАЮ СКОЛЬКО Я ВВЕДУ СИМВОЛОВ?
Добро пожаловать в Си. Никто не знает, поэтому обычно все используют буферы и читают строки по частям.

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Jewbacabra Посмотреть сообщение
А вообще весь разговор с тобой напоминает следующее:
...
И более того: вроде этот биатлонист и хочет научиться стрелять, а инструкции по стрельбе и оружию читать напрочь отказывается.

0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
08.06.2014, 18:51 9
Цитата Сообщение от GetHelp Посмотреть сообщение
char *str;
scanf("%s", str);
может все таки так
C++
1
2
char str[100];
scanf("%s", str);
или malloc как указал Jewbacabra,
Цитата Сообщение от GetHelp Посмотреть сообщение
да не должна она выделяться !!! почему то всегда работала без выделения, а тут вдруг зачем то выделять, это бред !!!
пример плиз
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
08.06.2014, 18:51  [ТС] 10
Jewbacabra, http://www.mir-koda.ru/full_leson_cpp.php?id=7

korvin_, что за буферы и как читать строки по частям? о_О
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
08.06.2014, 18:54 11
Цитата Сообщение от GetHelp Посмотреть сообщение
чисто забиваете в гугл "си scanf" и читаете...
читаем первая же ссылка
http://lord-n.narod.ru/downloa... /scanf.htm
пример
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main(void)
{
  char str[80], str2[80];
  int i;
 
  /* читается строка и целое значение */
  scanf("%s%d", str, &i);
 
  /* в переменную str считывается не более 79 символов */
  scanf("%79s", str);
 
  /* целое, расположенное между двумя строками, пропускается */
  scanf("%s%*d%s", str, str2);
 
  return 0;
}
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
08.06.2014, 18:55 12
Цитата Сообщение от GetHelp Посмотреть сообщение
что за буферы и как читать строки по частям? о_О
Цитата Сообщение от ValeryS Посмотреть сообщение
может все таки так
C
1
2
char str[100];
scanf("%s", str);
Точнее так:
C
1
2
char str[100];
scanf("%[99]s", str);
А лучше
C
1
2
3
4
#define BUFSIZE 100
...
char str[BUFSIZE];
fgets(str, BUFSIZE-1, stdin);
хотя это может зависеть от необходимого поведения.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
08.06.2014, 18:55 13
Цитата Сообщение от GetHelp Посмотреть сообщение
читаем
Пока не вникайте в работу со строками. Почему нету знака взятия адреса? Эту тему мы рассмотрим чуть позднее.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.06.2014, 18:56 14
GetHelp, читать надо от начала и до конца, дальше там написано:
Пока не вникайте в работу со строками. Почему нету знака взятия адреса? Эту тему мы рассмотрим чуть позднее.
тут лишь говорится что %s интерпретирует входные данные как символьную строку.
0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
08.06.2014, 18:56 15
Цитата Сообщение от GetHelp Посмотреть сообщение
http://www.mir-koda.ru/full_leson_cpp.php?id=7
М-да уж. Лучше K&R почитать…
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.06.2014, 18:56 16
ValeryS, оперелил
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
08.06.2014, 18:58 17
korvin_,
наверное лучше
я просто показал разницу между
char *str;
и char str[100];

Добавлено через 56 секунд

Не по теме:

Цитата Сообщение от Jewbacabra Посмотреть сообщение
ValeryS, оперелил
а вот такой я :)

0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
08.06.2014, 19:06  [ТС] 18
Цитата Сообщение от korvin_ Посмотреть сообщение
#define BUFSIZE 100
...
char str[BUFSIZE];
fgets(str, BUFSIZE-1, stdin);
но это опять же чтение строки фиксированной длины, неужели никак нельзя читать строки не фиксированной длины? О_о вы же просто задаете фиксированный массив с длинной заданной дефайном... а если я захочу ввести строку длинной 100500 символов? (да буду ее сутки вводить но введу)
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
08.06.2014, 19:19 19
Цитата Сообщение от GetHelp Посмотреть сообщение
если я захочу ввести строку длинной 100500 символов? (да буду ее сутки вводить но введу)
выдели массив под 100501 элемент

Добавлено через 5 минут
Цитата Сообщение от GetHelp Посмотреть сообщение
неужели никак нельзя читать строки не фиксированной длины?
в Си никак
в плюсах есть string
вообще возможно и в Си, но это нужно сильно постараться
общий алгоритм такой
1 выделяешь память под один элемент( malloc)
2 считываешь символ
если это конец строки то выходим из цикла
иначе
3 добавляем к памяти 1 элемент(realloc) и заносим туда символ
4 идем к пункту 2
5 заносим в конец 0(признак конца строки)
0
71 / 45 / 24
Регистрация: 11.05.2014
Сообщений: 179
08.06.2014, 19:48 20
Цитата Сообщение от Jewbacabra Посмотреть сообщение
выдели память через malloc, calloc
Да хоть бы тупо - char string[1024]
0
08.06.2014, 19:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2014, 19:48
Помогаю со студенческими работами здесь

Как пользоваться потоком строк
Как stringstream-ом получить поток строк, а потом все их, не смешав, записать в массив строк?

Чем правильно пользоваться для сравнения строк - equals или compareTo ?
Все собираюсь спросить: Если я в Си инициализирую строку, а потом захочу ее изменить в сторону...

чтение строк, scanf()
scanf(&quot;%20s&quot;, str1); такой код считает первые 20 символов, введенных с клавиатуры в переменную...

Не работает scanf в одной из строк
#include &lt;stdio.h&gt; int main() { int a, b, c, loop; char symbol; char change; while(1)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru