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

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

08.06.2014, 18:02. Показов 13753. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru