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

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

08.06.2014, 18:02. Просмотров 1572. Ответов 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
QA
Эксперт
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 change; while(1)...

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

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

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

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

Не по теме:

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

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

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

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

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

Не по теме:

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

0
ValeryS
Модератор
7847 / 5833 / 762
Регистрация: 14.02.2011
Сообщений: 20,037
Завершенные тесты: 1
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
61 / 62 / 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
ValeryS
Модератор
7847 / 5833 / 762
Регистрация: 14.02.2011
Сообщений: 20,037
Завершенные тесты: 1
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_
2736 / 2009 / 361
Регистрация: 28.04.2012
Сообщений: 6,833
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
Модератор
7847 / 5833 / 762
Регистрация: 14.02.2011
Сообщений: 20,037
Завершенные тесты: 1
08.06.2014, 18:55 13
Цитата Сообщение от GetHelp Посмотреть сообщение
читаем
Пока не вникайте в работу со строками. Почему нету знака взятия адреса? Эту тему мы рассмотрим чуть позднее.
0
Jewbacabra
Эксперт PHP
4033 / 3315 / 1429
Регистрация: 24.04.2014
Сообщений: 10,022
08.06.2014, 18:56 14
GetHelp, читать надо от начала и до конца, дальше там написано:
Пока не вникайте в работу со строками. Почему нету знака взятия адреса? Эту тему мы рассмотрим чуть позднее.
тут лишь говорится что %s интерпретирует входные данные как символьную строку.
0
korvin_
2736 / 2009 / 361
Регистрация: 28.04.2012
Сообщений: 6,833
08.06.2014, 18:56 15
Цитата Сообщение от GetHelp Посмотреть сообщение
http://www.mir-koda.ru/full_leson_cpp.php?id=7
М-да уж. Лучше K&R почитать…
0
Jewbacabra
Эксперт PHP
4033 / 3315 / 1429
Регистрация: 24.04.2014
Сообщений: 10,022
08.06.2014, 18:56 16
ValeryS, оперелил
0
ValeryS
Модератор
7847 / 5833 / 762
Регистрация: 14.02.2011
Сообщений: 20,037
Завершенные тесты: 1
08.06.2014, 18:58 17
korvin_,
наверное лучше
я просто показал разницу между
char *str;
и char str[100];

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

Не по теме:

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

0
GetHelp
61 / 62 / 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
ValeryS
Модератор
7847 / 5833 / 762
Регистрация: 14.02.2011
Сообщений: 20,037
Завершенные тесты: 1
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
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 19:48

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

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

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


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

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

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