Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/64: Рейтинг темы: голосов - 64, средняя оценка - 4.91
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116

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

08.06.2014, 18:02. Показов 13742. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.06.2014, 18:02
Ответы с готовыми решениями:

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

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

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

31
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
08.06.2014, 19:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ValeryS Посмотреть сообщение
вообще возможно и в Си, но это нужно сильно постараться
общий алгоритм такой
1 выделяешь память под один элемент( malloc)
2 считываешь символ
если это конец строки то выходим из цикла
иначе
3 добавляем к памяти 1 элемент(realloc) и заносим туда символ
4 идем к пункту 2
5 заносим в конец 0(признак конца строки)
Выделять память посимвольно не стоит. Лучше увеличивать размер массива в два раза, как это принято в STL, AFAIK.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
08.06.2014, 19:57  [ТС]
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
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
08.06.2014, 20:04
Цитата Сообщение от 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
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
08.06.2014, 20:09
Цитата Сообщение от korvin_ Посмотреть сообщение
scanf("%[99]s", str);
Квадратные скобки вроде же определяют scanset, то есть в читаться будут только 9, а если встретится не 9, то чтение прекратится.
А ограничить поле же без скобок
C
1
scanf("%99s", str);
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
08.06.2014, 20:15  [ТС]
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
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
08.06.2014, 20:19
Цитата Сообщение от Вованя Посмотреть сообщение
Квадратные скобки вроде же определяют scanset, то есть в читаться будут только 9, а если встретится не 9, то чтение прекратится.
А ограничить поле же без скобок
Да, точно, бес попутал.

Добавлено через 2 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
вот кажется нашел, надо сравнивать вроде не с '\0', а с '\n', потому что строку ввел и жмешь Enter т.е. перевод строки... ну во всяком случае с '\n' хоть что то выводит...
Ну так это уже твое дело до какого символа читать строку. Можно, например, вместо жестко заданного '\n' передавать в GetString массив символов-ограничителей.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
08.06.2014, 20:21  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Ну так это уже твое дело до какого символа читать строку. Можно, например, вместо жестко заданного '\n' передавать в GetString массив символов-ограничителей.
просто если считывать до '\0' то он будет до бесконечности считывать, поскольку '\0' никогда не появится без перевода строки... но все же скажите что не так, почему выводит что то лишнее?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
08.06.2014, 20:40
Цитата Сообщение от korvin_ Посмотреть сообщение
Выделять память посимвольно не стоит.
Да знаю я
это же идея а не готовый алгоритм
и я специально сказал про один символ, чтобы концентрировать идею, а не увязнуть в размерах
Цитата Сообщение от GetHelp Посмотреть сообщение
это интересно, я люблю изобретать велосипеды
поищи здесь на форуме, месяца два назад проскакивала подобная тема

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

Добавлено через 2 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
выводит искомую строку (после считывания уже) и еще добавляет что то типа xxx^^^
это потому что не поставил завершающий 0 вот он и выдает весь мусор из памяти пока не встретит 0
1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
08.06.2014, 20:58  [ТС]
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
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
08.06.2014, 21:05
Цитата Сообщение от GetHelp Посмотреть сообщение
все вроде работает,
это первый этап
realloc слишком медленный поэтому его лучше вызывать как можно реже
путь есть такой
выделяешь сразу несколько ячеек памяти, например 20
и записываешь в неё, как только память заполняется уже 40 потом 60 ну и так далее
потом можешь подсчитать количество символов( длину строки) прибавить 1, (для 0) и усечь память тем же realloc
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
08.06.2014, 21:27  [ТС]
ValeryS, а зачем усложнять? у меня все работает мгновенно, с чего вы взяли что он медленный? причем мгновенно даже на больших строках (специально щас абракадабру вводил целую минуту )
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
08.06.2014, 22:37
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.06.2014, 22:37

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru