Премини към съдържанието

Препоръчан отговор


Извинявам се за глупавия въпрос, но никъде нищо не намерих в нета и в книгата ми. Защо като сложа това

case "\t": t++;
ми дава следната грешка:

case label doesn't reduce to an integer constant
но като сложа единични кавички всичко върви ?

case '\t': t++;
Редактирано от frozener (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами съобщението си е съвсем ясно. switch работи само с типове, които могат да се превърнат директно към цяло число. Единичните кавички означават константа от тип char - който си е цяло число, а двойните константа от тип char[], тоест низ. Очевидно второто не може да се превърне директно в int.

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами съобщението си е съвсем ясно. switch работи само с типове, които могат да се превърнат директно към цяло число. Единичните кавички означават константа от тип char - който си е цяло число, а двойните константа от тип char[], тоест низ. Очевидно второто не може да се превърне директно в int.

не го знаех, мерси. Но видях преимуществото на шел скриптовете в този случай :)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

не го знаех, мерси. Но видях преимуществото на шел скриптовете в този случай :)

Всеки с вкуса си. Едно нещо работи ли с 50 типа, значи може 50 пъти да го сбъркаш. В т'ва отношение, евала на Haskell - там ако една функция иска float, даже int не можеш да и дадеш :D .
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Всеки с вкуса си. Едно нещо работи ли с 50 типа, значи може 50 пъти да го сбъркаш. В т'ва отношение, евала на Haskell - там ако една функция иска float, даже int не можеш да и дадеш :D .

то явно за това в корн шел има само един тип променливи и конверсията се прави в движение, макар че аз предпочитам да си ги разделям и да си ги проверявам :)

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Хъм, само малко допълнение - за цвят! В .NET switch стеймънта работи върху всякакви типове с условието case константата да е от същия тип като променливата която сравняваме (допуска се и промотване). Удобство. Също така всеки case/default или група case-ове прябва да имат brake стейтмънт. И да искаш не може да се оакаш с такава конструкция :)

  • Харесва ми 3

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Хъм, само малко допълнение - за цвят! В .NET switch стеймънта работи върху всякакви типове с условието case константата да е от същия тип като променливата която сравняваме (допуска се и промотване). Удобство. Също така всеки case/default или група case-ове прябва да имат brake стейтмънт. И да искаш не може да се оакаш с такава конструкция :)

То C# съдържа C в името си само за реклама...
  • Харесва ми 3

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Хахаха. Това е приказка от кораджия. Но, лошо няма. Ако C++ e хубост, то C# е красота :)

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Хахаха. Това е приказка от кораджия. Но, лошо няма. Ако C++ e хубост, то C# е красота :)

:wink12: Е, не съм казал аз, че много на хубаво, не е на хубаво :tongue2: Редактирано от flare (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Недей така, не всяка красавица е невярна жена :) Един рефлекшън само какво струва а? :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

А как ще стане подобна програмка на C++ ? getline(); и cin не ми вършат работа.

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char str[100];
    int s,t;
    s = 0;
    t = 0;
    cout << "Enter a string: " << endl;
    cin >> str;
    for(int i=0;i<strlen(str);i++)
    {
	    switch(str[i])
	    {
		    case ' ': s++;
		    break;
		    case '\t': t++;
		    break;
	    }
    }
    cout << "Spaces: "<< s << "" << t << endl;

    return 0;
}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

А защо не може да ползваш getline?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Разбрах сега. Ти опитваш да ползваш функцията getline, която е част от библиoteката string. Това, което аз предлагах е метода getline от класа istream, в частност cin. т.е:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
	char str[100];
	int s,t;
	s = 0;
	t = 0;
	cout << "Enter a string: " << endl;
	cin.getline(str, 100);
	for(int i=0;i<strlen(str);i++)
	{
			switch(str[i])
			{
					case ' ': s++;
					break;
					case '\t': t++;
					break;
			}
	}
	cout << "String"<<str<<"Spaces: "<< s << " " << t << endl;
	return 0;
}
Редактирано от flare (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход


×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.