Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
maSt
5 / 5 / 3
Регистрация: 28.02.2010
Сообщений: 166
#1

Scanf и некоторые детали - C++

27.11.2012, 01:55. Просмотров 580. Ответов 16
Метки нет (Все метки)

Вот работаю со scanfom и появилось несколько вопросов.
C++
1
2
3
4
5
6
7
char name[10];
    
    do 
    {
        scanf("%s",&name);
}
while (...);
Вот 1 вопрос. У меня есть строка ,в строке 2 слова и 1 число.
Например CREATE file1 3.
В интернете находил примеры только как-то так как написал, но name = "С".Как правильно считать слово?
Заранее спасибо.
http://www.cyberforum.ru/cpp-beginners/thread191527.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 01:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Scanf и некоторые детали (C++):

Главная функция (вводит некоторые значения и передает их и ссылки на некоторые переменные в функцию)
Написать главную функцию, которая вводит некоторые значения и передает их и...

scanf()
Всем привет! Вот маленький тестовый пример #include <stdio.h> int i; ...

Scanf
#include <iostream> #include <string> #include <cstdio> #include <cstdlib>...

scanf ?
господа, подскажите пожалуйста, почему после этого в VC++ вылетает исключение о...

scanf
Пусть нужно читать из текста слова, пропуская все символы, кроме a-z и A-Z. То...

16
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
27.11.2012, 03:10 #2
считывать его надо не в переменную типа char, а в массив типа char*.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 03:30 #3
Вопрос понятней изложите. Если каждое слово из строки отдельно, а число в переменую типа int, то так можно:
C++
1
2
3
4
char name[10];
char name2[10];
int n = 0;
scanf("%s%s%d", &name, &name2, &n);
В name[] будет: "CREATE", в name2[]: "file1", в n: 3.
0
Kuzia domovenok
2209 / 1978 / 441
Регистрация: 25.03.2012
Сообщений: 6,944
Записей в блоге: 1
27.11.2012, 03:46 #4
Цитата Сообщение от alsav22 Посмотреть сообщение
В name[] будет: "CREATE", в name2[]: "file1", в n: 3.
нет, не будет

Добавлено через 27 секунд
Цитата Сообщение от maSt Посмотреть сообщение
scanf("%s",&name);
и у тебя не будет

Почему вы передаёте в сканф что угодно, но не адрес начала строки?
C++
1
scanf("%s", name);
1
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 03:56 #5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
нет, не будет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    char name[10];
    char name2[10];
    int n = 0;
    
    scanf("%s%s%d", &name, &name2, &n);
 
    cout << name << endl << name2 << endl << n << endl;
    
    system("pause");
    return 0;
}
0
Миниатюры
Scanf и некоторые детали  
Kuzia domovenok
2209 / 1978 / 441
Регистрация: 25.03.2012
Сообщений: 6,944
Записей в блоге: 1
27.11.2012, 04:08 #6
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
* * char name[10];
* * char name2[10];
* * int n = 0;
scanf("%s%s%d", &name, &name2, &n);
cout << name << endl << name2 << endl << n << endl;
system("pause");
* * return 0;
}
Тогда я ничего не понял. неужели нет разницы
между name и &name ?
Если нет, то выходит также нет и между
между &(name[0]) и &name !
следовательно нет и между name[0] и name
следовательно бред какой-то...
0
MrGluck
Модератор
Эксперт CЭксперт С++
8021 / 4864 / 1425
Регистрация: 29.11.2010
Сообщений: 13,240
27.11.2012, 04:14 #7
Kuzia domovenok, фишка в том, что scanf принимает в начале как бы указатели, но %s само содержит указатель и разыменовывает его, получается оно сразу считывает адрес, а не ждет его.

Голова уже не варит, но надеюсь что-то объяснить удалось.

Хотя могу и ошибаться.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 04:16 #8
Компиляторы почему-то пропускают. Студия без предупреждений, mingv - только предупреждения.
0
MrGluck
Модератор
Эксперт CЭксперт С++
8021 / 4864 / 1425
Регистрация: 29.11.2010
Сообщений: 13,240
27.11.2012, 04:18 #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Компиляторы почему-то пропускают. Студия без предупреждений, mingv - только предупреждения.
Ну смотря какой mingw, мой вот не фыркает.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 04:28 #10
Цитата Сообщение от MrGluck Посмотреть сообщение
мой вот не фыркает
А warnings включены?
0
MrGluck
Модератор
Эксперт CЭксперт С++
8021 / 4864 / 1425
Регистрация: 29.11.2010
Сообщений: 13,240
27.11.2012, 04:37 #11
Цитата Сообщение от alsav22 Посмотреть сообщение
А warnings включены?
Включены дефолтные, а вот если сделать -Wall, то уже появляются.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
27.11.2012, 09:12 #12
clang++3.1

new.cpp:6:12: warning: format specifies type 'char *' but the argument has type 'char (*)[10]' [-Wformat]
scanf("%s", &p);
И вообще, давайте не будем писать некорректно. Все-таки код alsav22 некорректен, а как отреагирует на него компилятор - это дело компилятора.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 17:01 #13
Цитата Сообщение от ForEveR Посмотреть сообщение
И вообще, давайте не будем писать некорректно. Все-таки код alsav22 некорректен
Согласен.
0
maSt
5 / 5 / 3
Регистрация: 28.02.2010
Сообщений: 166
27.11.2012, 18:12  [ТС] #14
Спасибо всем большое. Теперь когда я вывожу то что считал на экран получаю CREATE.
Но есть еще проблема , когда я пытаюсь сделать так
C++
1
if (name == "CREATE")
То оно не проходит. В интернете уже обыскался нормальной статьи с объяснениями как работает char, но так ничего и не нашел.
И вопрос номер 2.
Возможно ли считать CREATE file1 3
в string ,а потом с этой строки по очереди считать все элементы?
И если да, то как?
0
Kuzia domovenok
2209 / 1978 / 441
Регистрация: 25.03.2012
Сообщений: 6,944
Записей в блоге: 1
27.11.2012, 18:15 #15
C++
1
if (strcmp(name, "CREATE")==0){}
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 18:31 #16
Цитата Сообщение от maSt Посмотреть сообщение
И вопрос номер 2.
Возможно ли считать CREATE file1 3
в string ,а потом с этой строки по очереди считать все элементы?
И если да, то как?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
 
int main()
{
    string str;
    string name;
    int n = 0;
    
    stringstream s;
    
    getline(cin, str);
    
    s << str;
    s >> str >> name >> n;
 
    cout << str << endl << name << endl << n << endl;
    
    system("pause");
    return 0;
}
1
Миниатюры
Scanf и некоторые детали  
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.11.2012, 18:37 #17
Если name - string, то можно и так писать:
C++
1
if (name == "file1")
0
27.11.2012, 18:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 18:37
Привет! Вот еще темы с решениями:

scanf в C
можна прочитать несколько значений использав всего раз scanf например : scanf...

Scanf зацикливание
Почему зацикливается при вводе символа? int a; while (scanf_s(&quot;%d&quot;, &amp;a) !=...

MPI и scanf в С++
Вобщем я делаю параллельную программу. Все процессы в этой программе должны...

scanf. Разбиение.
Помогите с задачей. Не могу додуматься как это сделать: С клавиатуры вводится...


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

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

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