Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.84
SZ
2 / 2 / 0
Регистрация: 16.11.2008
Сообщений: 44
#1

Проблемы с пробелом - C++

12.03.2009, 00:20. Просмотров 3974. Ответов 12
Метки нет (Все метки)

Дан код на Си:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<string.h>
void main()
{
    char s[1000];
    printf("Vvedite stroky:\n");
    scanf("%s",s);
    for(int i=0;i<strlen(s);i++)
    {
        if(s[i]=='  ')
        {
            printf("Adres bykvi - %d, sama bukva - %c\n",&s[i],s[i]);
        }
    }
}
Проблема в том, что программа не хочет работать с пробелами, со всеми остальными символами работает нормально, а пробелы не принимает.
Я вручную ввожу строку (qwert qwert), в коде поочередно сам меняю вместо пробела другие символы. Напр, для буквы 'r' printf() выводит: "Адрес - 1244027, сама буква - r", для 't' - "Адрес - 1244028, сама буква - t". Доходит очередь до пробела, и меня просто отсылает программа на следующую строку. Это что специфический символ какой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2009, 00:20     Проблемы с пробелом
Посмотрите здесь:

C++ Слова в предложении разделены пробелом......
C++ Добавить второе предложение к первому, отделив их пробелом
Последовательности следующих друг за другом пробелов заменить одним пробелом (т.е. удалить все пробелы, следующие непосредственно за пробелом) C++
Ввод одного символа и строки с пробелом C++
C++ Постановка запятой перед каждым пробелом
C++ Внести слова, разделенные пробелом, из строки в массив
Конец предложения точка с последующим пробелом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
12.03.2009, 00:35     Проблемы с пробелом #2
scanf не записывает пробелов, т.е. при встрече пробела он считает, что строка закончилась и пишет символ конца строки. Как вариант, можно использовать ввод getchar'ом.
SZ
2 / 2 / 0
Регистрация: 16.11.2008
Сообщений: 44
12.03.2009, 00:39  [ТС]     Проблемы с пробелом #3
Цитата Сообщение от Nestor Посмотреть сообщение
scanf не записывает пробелов, т.е. при встрече пробела он считает, что строка закончилась и пишет символ конца строки. Как вариант, можно использовать ввод getchar'ом.
Спасибо большое. Gets пошло.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 00:40     Проблемы с пробелом #4
есть хорошая функци gets() библитотеки stdio.h

C++
1
2
char *str;
gets(str);
SZ
2 / 2 / 0
Регистрация: 16.11.2008
Сообщений: 44
12.03.2009, 00:49  [ТС]     Проблемы с пробелом #5
Цитата Сообщение от Don Corleone Посмотреть сообщение
есть хорошая функци gets() библитотеки stdio.h

C++
1
2
char *str;
gets(str);
Оки. Я уже написал. Вот одно из ее преимуществ.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 00:52     Проблемы с пробелом #6
в с++ есть еще альтернатива у метода обьекта cout
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.03.2009, 01:03     Проблемы с пробелом #7
Цитата Сообщение от Nestor Посмотреть сообщение
scanf не записывает пробелов, т.е. при встрече пробела он считает, что строка закончилась и пишет символ конца строки. Как вариант, можно использовать ввод getchar'ом.
Это ошибочное утверждение. scanf легко читает пробелы и другие символы.
Дело не в scanf, а в спецификаторе s. Если я, например, сделаю так:
C
1
scanf("%10c", s)
То в считанные десять символов попадут пробелы (нужно не забыть нулевой символ в конце).
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 01:09     Проблемы с пробелом #8
Цитата Сообщение от Vourhey Посмотреть сообщение
Это ошибочное утверждение. scanf легко читает пробелы и другие символы.
Дело не в scanf, а в спецификаторе s. Если я, например, сделаю так:
C
1
scanf("%10c", s)
То в считанные десять символов попадут пробелы (нужно не забыть нулевой символ в конце).
да, и так можно... но согласись, так ты задаешь кол-во считываемых символов, а так ты считываешь строку целиком... поэтому gets() приемлемей..
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.03.2009, 01:16     Проблемы с пробелом #9
Don Corleone, не соглашусь ни с одним из вас.
Первое: scanf нормально читает пробелы.
Второе: не нравится задание количества символов? Простите, а зачем тогда
char s[1000] задали тысячу? но согласись ты здесь ограничил длину строки ? И чем мое ограничение уступает твоему? gets - дыра в программе.
Давайте тогда писать по-нормальному и использовать fgets, на stdin раз вы за приемлемость. Вот это и есть правильное решение. gets не приемлемое решение.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 01:28     Проблемы с пробелом #10
Vourhey, у каждого свое мнение на этот счет... я вообще использую метод объекта cin .. в некоторых случаях использую scanf... все зависит от программы.. и необходимо использовать то, что наиболее преемлево в данном случае...
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.03.2009, 01:46     Проблемы с пробелом #11
необходимо использовать то, что наиболее преемлево в данном случае...
С этим никто и не спорит.
А тут и без мнений все понятно. Ты говоришь, зачем там нужно количество символов. Вот я тебе и ответил, что за тем же, зачем и в char s[1000];.
Поэтому в данном случае приемлем и scanf и gets. Оба. Причем, scanf будет безопасней. А cin оставим лучше сумасшедшим плюсам, так как, у нас тут замечательные С.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2009, 01:56     Проблемы с пробелом #12
Цитата Сообщение от Vourhey Посмотреть сообщение
А cin оставим лучше сумасшедшим плюсам, так как, у нас тут замечательные С.
я не понимаю, что люди имею тпротив с++ ?? по-моему замечательный гибкий язык!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2009, 02:41     Проблемы с пробелом
Еще ссылки по теме:

C++ Разделение выводимых цифр пробелом.
C++ Класс (вводить данные пока фамилия не будет пробелом)
Считывание из файла чисел, разделенных пробелом, в массив C++
C++ Вставить перед каждым пробелом запятую
C++ Когда ввожу в файл данные с пробелом - выдает ошибку

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

Или воспользуйтесь поиском по форуму:
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.03.2009, 02:41     Проблемы с пробелом #13
можно заюзать
Код
    if (scanf("%100[^\n]%*с", s) == 1)
        Print("ok");
gets, конечно, не имеет защиты от более длинной, чем символьный массив, строки
fgets останавливается на \n и, даже если это нужно, записывает его в строку, а для scanf можно любой паттерн задать хоть остановка на пробеле (типа строкой считается всё от пробела до пробела)

для C++ есть ещё getline()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
#include <iostream>
 
#define MAXLINE  1000   /* максимальная длина строки */
 
using namespace std;
 
/* запрашивает строку с помощью метода cin и выводит её */
int main()
{
    char line[MAXLINE];
    
    cin.getline(line, MAXLINE);
    cout << line << endl;
    return 0;
}
Yandex
Объявления
12.03.2009, 02:41     Проблемы с пробелом
Ответ Создать тему
Опции темы

Текущее время: 13:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru