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

Как пользоваться scanf для строк - C (СИ)

08.06.2014, 18:02. Просмотров 1228. Ответов 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"." тоже вообще не понятно с какого перепуга... запарился, вроде так просто и такой гемор... че за фигня хз...
http://www.cyberforum.ru/c-beginners/thread1081391.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2014, 18:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как пользоваться scanf для строк (C (СИ)):

Не работает 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 переменной
Добрый вечер. Бьюсь над проблемой следующего характера: составил функцию,...

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

31
korvin_
2096 / 1587 / 308
Регистрация: 28.04.2012
Сообщений: 5,718
08.06.2014, 19:54 #21
Цитата Сообщение от ValeryS Посмотреть сообщение
вообще возможно и в Си, но это нужно сильно постараться
общий алгоритм такой
1 выделяешь память под один элемент( malloc)
2 считываешь символ
если это конец строки то выходим из цикла
иначе
3 добавляем к памяти 1 элемент(realloc) и заносим туда символ
4 идем к пункту 2
5 заносим в конец 0(признак конца строки)
Выделять память посимвольно не стоит. Лучше увеличивать размер массива в два раза, как это принято в STL, AFAIK.
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
08.06.2014, 19:57  [ТС] #22
ValeryS, это интересно, я люблю изобретать велосипеды

вот набросал, только че то чувствую не так... хотя бы потому что не работает =)

C
1
2
3
4
5
6
7
8
9
10
11
12
char* GetString()
{
    char *str = (char*) malloc(sizeof(char));
    int count = 1;
    while(getchar() != '\0')
    {
        str[count - 1] = getchar();
        str = (char*) realloc(str, ++count * sizeof(char));
    }
    str[count - 1] = '\0';
    return str;
}
0
korvin_
2096 / 1587 / 308
Регистрация: 28.04.2012
Сообщений: 5,718
08.06.2014, 20:04 #23
Цитата Сообщение от GetHelp Посмотреть сообщение
вот набросал, только че то чувствую не так... хотя бы потому что не работает =)
А не надо getchar() вызывать два раза подряд.

C
1
2
3
4
5
6
7
8
9
10
char* GetString()
{
    char *s = malloc(sizeof(char));
    int n = 0;
    while((s[n] = getchar()) != '\0') {
        ++n;
        s = realloc(str, (n+1) * sizeof(char));
    }
    return s;
}
0
Вованя
137 / 134 / 63
Регистрация: 20.02.2014
Сообщений: 478
Завершенные тесты: 1
08.06.2014, 20:09 #24
Цитата Сообщение от korvin_ Посмотреть сообщение
scanf("%[99]s", str);
Квадратные скобки вроде же определяют scanset, то есть в читаться будут только 9, а если встретится не 9, то чтение прекратится.
А ограничить поле же без скобок
C
1
scanf("%99s", str);
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
08.06.2014, 20:15  [ТС] #25
korvin_, так и правда лучше, но все равно что то не так... вот кажется нашел, надо сравнивать вроде не с '\0', а с '\n', потому что строку ввел и жмешь Enter т.е. перевод строки... ну во всяком случае с '\n' хоть что то выводит...

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char* GetString()
{
    char *str = (char*) malloc(sizeof(char));
    int count = 1;
    while((str[count - 1] = getchar()) != '\n')
        str = (char*) realloc(str, ++count * sizeof(char));
    return str;
}
 
void main()
{
    char *str;
    printf("str: ");
    str = GetString();
    printf("%s", str);
    getch();
}
только он лишнего выводит чего то... выводит искомую строку (после считывания уже) и еще добавляет что то типа xxx^^^
0
korvin_
2096 / 1587 / 308
Регистрация: 28.04.2012
Сообщений: 5,718
08.06.2014, 20:19 #26
Цитата Сообщение от Вованя Посмотреть сообщение
Квадратные скобки вроде же определяют scanset, то есть в читаться будут только 9, а если встретится не 9, то чтение прекратится.
А ограничить поле же без скобок
Да, точно, бес попутал.

Добавлено через 2 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
вот кажется нашел, надо сравнивать вроде не с '\0', а с '\n', потому что строку ввел и жмешь Enter т.е. перевод строки... ну во всяком случае с '\n' хоть что то выводит...
Ну так это уже твое дело до какого символа читать строку. Можно, например, вместо жестко заданного '\n' передавать в GetString массив символов-ограничителей.
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
08.06.2014, 20:21  [ТС] #27
Цитата Сообщение от korvin_ Посмотреть сообщение
Ну так это уже твое дело до какого символа читать строку. Можно, например, вместо жестко заданного '\n' передавать в GetString массив символов-ограничителей.
просто если считывать до '\0' то он будет до бесконечности считывать, поскольку '\0' никогда не появится без перевода строки... но все же скажите что не так, почему выводит что то лишнее?
0
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
08.06.2014, 20:40 #28
Цитата Сообщение от korvin_ Посмотреть сообщение
Выделять память посимвольно не стоит.
Да знаю я
это же идея а не готовый алгоритм
и я специально сказал про один символ, чтобы концентрировать идею, а не увязнуть в размерах
Цитата Сообщение от GetHelp Посмотреть сообщение
это интересно, я люблю изобретать велосипеды
поищи здесь на форуме, месяца два назад проскакивала подобная тема

я тоже поищу, если найду скину ссылку

Добавлено через 2 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
выводит искомую строку (после считывания уже) и еще добавляет что то типа xxx^^^
это потому что не поставил завершающий 0 вот он и выдает весь мусор из памяти пока не встретит 0
1
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
08.06.2014, 20:58  [ТС] #29
ValeryS, спасибо огромное

все вроде работает, вот конечная версия =)

C
1
2
3
4
5
6
7
8
9
char* GetString()
{
    char *str = (char*) malloc(sizeof(char));
    int count = 1;
    while((str[count - 1] = getchar()) != '\n')
        str = (char*) realloc(str, ++count * sizeof(char));
    str[count - 1] = '\0';
    return str;
}
0
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
08.06.2014, 21:05 #30
Цитата Сообщение от GetHelp Посмотреть сообщение
все вроде работает,
это первый этап
realloc слишком медленный поэтому его лучше вызывать как можно реже
путь есть такой
выделяешь сразу несколько ячеек памяти, например 20
и записываешь в неё, как только память заполняется уже 40 потом 60 ну и так далее
потом можешь подсчитать количество символов( длину строки) прибавить 1, (для 0) и усечь память тем же realloc
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
08.06.2014, 21:27  [ТС] #31
ValeryS, а зачем усложнять? у меня все работает мгновенно, с чего вы взяли что он медленный? причем мгновенно даже на больших строках (специально щас абракадабру вводил целую минуту )
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.06.2014, 22:37 #32
Цитата Сообщение от korvin_ Посмотреть сообщение
C
1
2
3
4
#define BUFSIZE 100
...
char str[BUFSIZE];
fgets(str, BUFSIZE-1, stdin);
C
1
fgets(str, BUFSIZE, stdin);
Цитата Сообщение от korvin_ Посмотреть сообщение
Точнее так:
C
1
2
char str[100];
scanf("%[99]s", str);
нет
C
1
scanf("%99s", str);
0
08.06.2014, 22:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2014, 22:37
Привет! Вот еще темы с решениями:

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

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

Не понимаю как работает scanf
Здравствуйте, вот код программы. При работе программы второй scanf...

Как очистить буфер scanf() ?
Мне нужно, чтобы scanf() вызывался до тех пор, пока не будет введено целое...


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

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

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