Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
#1

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

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

хоть убей не могу понять как пользоваться 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2014, 18:02
Ответы с готовыми решениями:

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

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

Чтение строк, разделённых пробелами, через scanf
В ходе решения задачи возникла проблема: нужно считывать строки, разделённые...

Из вводимых строк найти слова, у которых заданный символ встречается дважды - Не работает scanf
#include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h>...

Scanf читает 2 символа для 1 переменной
Добрый вечер. Бьюсь над проблемой следующего характера: составил функцию,...

31
helper
70 / 44 / 24
Регистрация: 11.05.2014
Сообщений: 176
08.06.2014, 18:08 #2
Указатель объявили, а память не выделили под строку.
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
08.06.2014, 18:11  [ТС] #3
Цитата Сообщение от helper Посмотреть сообщение
Указатель объявили, а память не выделили под строку.
да не должна она выделяться !!! почему то всегда работала без выделения, а тут вдруг зачем то выделять, это бред !!! но даже если выделять, вон я сделал инициализацию, все равно ошибка, вы читайте весь пост...
0
korvin_
2103 / 1596 / 308
Регистрация: 28.04.2012
Сообщений: 5,735
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
Jewbacabra
Эксперт PHP
3237 / 2737 / 1243
Регистрация: 24.04.2014
Сообщений: 8,345
08.06.2014, 18:14 #5
GetHelp, а ты не задумывался куда строка должна сохраняться? А вариант с инициализацией "", это просто ................ (не матерных слов что бы описать это не нашел)
Сделай как говорит helper, нормально выдели память через malloc, calloc
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
08.06.2014, 18:26  [ТС] #6
Jewbacabra, почитайте гугл, НИГДЕ нет про выделение памяти для этого... везде так прямо считывают... чисто забиваете в гугл "си scanf" и читаете... и отвечаю у меня всегда это работало безо всяких выделений... в конце концов ОТКУДА Я ЗНАЮ СКОЛЬКО Я ВВЕДУ СИМВОЛОВ ??? вы об этом подумали? я наверное не даром объявляю указатель а не статический массив?
0
Jewbacabra
Эксперт PHP
3237 / 2737 / 1243
Регистрация: 24.04.2014
Сообщений: 8,345
08.06.2014, 18:39 #7
GetHelp, приведи ссылку где написано, что надо делать так:
C
1
2
char *str;
scanf("%s", str);

Не по теме:

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

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

0
korvin_
2103 / 1596 / 308
Регистрация: 28.04.2012
Сообщений: 5,735
08.06.2014, 18:47 #8
Цитата Сообщение от GetHelp Посмотреть сообщение
почитайте гугл, НИГДЕ нет про выделение памяти для этого...
Потому что это считается очевидным, т.к. scanf не может присвоить адрес на считанную строку во внешнюю переменную.

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

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

Не по теме:

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

0
ValeryS
Модератор
7166 / 5433 / 674
Регистрация: 14.02.2011
Сообщений: 18,351
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
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
08.06.2014, 18:51  [ТС] #10
Jewbacabra, http://www.mir-koda.ru/full_leson_cpp.php?id=7

korvin_, что за буферы и как читать строки по частям? о_О
0
ValeryS
Модератор
7166 / 5433 / 674
Регистрация: 14.02.2011
Сообщений: 18,351
08.06.2014, 18:54 #11
Цитата Сообщение от GetHelp Посмотреть сообщение
чисто забиваете в гугл "си scanf" и читаете...
читаем первая же ссылка
http://lord-n.narod.ru/download/book...C/13/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
korvin_
2103 / 1596 / 308
Регистрация: 28.04.2012
Сообщений: 5,735
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
ValeryS
Модератор
7166 / 5433 / 674
Регистрация: 14.02.2011
Сообщений: 18,351
08.06.2014, 18:55 #13
Цитата Сообщение от GetHelp Посмотреть сообщение
читаем
Пока не вникайте в работу со строками. Почему нету знака взятия адреса? Эту тему мы рассмотрим чуть позднее.
0
Jewbacabra
Эксперт PHP
3237 / 2737 / 1243
Регистрация: 24.04.2014
Сообщений: 8,345
08.06.2014, 18:56 #14
GetHelp, читать надо от начала и до конца, дальше там написано:
Пока не вникайте в работу со строками. Почему нету знака взятия адреса? Эту тему мы рассмотрим чуть позднее.
тут лишь говорится что %s интерпретирует входные данные как символьную строку.
0
korvin_
2103 / 1596 / 308
Регистрация: 28.04.2012
Сообщений: 5,735
08.06.2014, 18:56 #15
Цитата Сообщение от GetHelp Посмотреть сообщение
http://www.mir-koda.ru/full_leson_cpp.php?id=7
М-да уж. Лучше K&R почитать…
0
Jewbacabra
Эксперт PHP
3237 / 2737 / 1243
Регистрация: 24.04.2014
Сообщений: 8,345
08.06.2014, 18:56 #16
ValeryS, оперелил
0
ValeryS
Модератор
7166 / 5433 / 674
Регистрация: 14.02.2011
Сообщений: 18,351
08.06.2014, 18:58 #17
korvin_,
наверное лучше
я просто показал разницу между
char *str;
и char str[100];

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

Не по теме:

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

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

Добавлено через 5 минут
Цитата Сообщение от GetHelp Посмотреть сообщение
неужели никак нельзя читать строки не фиксированной длины?
в Си никак
в плюсах есть string
вообще возможно и в Си, но это нужно сильно постараться
общий алгоритм такой
1 выделяешь память под один элемент( malloc)
2 считываешь символ
если это конец строки то выходим из цикла
иначе
3 добавляем к памяти 1 элемент(realloc) и заносим туда символ
4 идем к пункту 2
5 заносим в конец 0(признак конца строки)
0
helper
70 / 44 / 24
Регистрация: 11.05.2014
Сообщений: 176
08.06.2014, 19:48 #20
Цитата Сообщение от Jewbacabra Посмотреть сообщение
выдели память через malloc, calloc
Да хоть бы тупо - char string[1024]
0
08.06.2014, 19:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 19:48

Scanf считывает enter, как символ конца строки. Как исправить?
Добрый день. Пишу меню для программы в Visual Studio 2015, возникает проблема:...

Функция scanf - параметры для фильтрации введенных данных
Проблема с scanf, что нужно добавить в параметр формат, что бы она считывала...

Как написать функцию scanf?
Как написать функцию scanf? Добавлено через 5 минут Не вызвать,а написать


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru