2016-10-10 3 views
2

есть ли более простой способ написать этот оператор if?Простой способ написать это, если функция C++

int main() 
{ 
    char k[100]; 
    int i=0; 
    ifstream fd ("info.txt"); 
    while (!in.eof()) 
    { 
    fd >> k[i] 
    if (int(k[i]) != 96 || int(k[i]) != 97 || 
     int(k[i]) != 98 || int(k[i]) != 99) 
      i++; 
    } 
} 

и так далее до 122. В принципе все, что я хочу сделать, это проверить, если символ в файле .txt соответствует всем буквы алфавита, знак @ и «» (период)

ли есть ли более простой способ сделать все это? Любая помощь высоко ценится !

+11

Используйте 'isalpha' и проверить для конкретных символов? Кроме того, не используйте магические числа. Если вы хотите проверить, что 'a' use' 'a'' не какое-то число. – NathanOliver

+4

также, см. [Почему «iostream :: eof' внутри условия цикла усложняется неправильно?] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered- неправильно). Кроме того, [этот вопрос] (http://stackoverflow.com/q/39150884/4892076) проверяется, соответствует ли символ набору символов. – jaggedSpire

+4

Это не ваш фактический код. Я сомневаюсь, что ваш компилятор не жаловался на неопределенный символ 'in'. – StoryTeller

ответ

4

Попробуйте это:

char c; 
while (fd >> c) 
{ 
    if ((c < '`') || (c > 'c')) 
    { 
    k[i] = c; 
    ++i; 
    } 
} 

Обычно, используя символьные константы более читабельным, чем их ASCII десятичных эквивалентов.

Также using eof in a loop is considered wrong, поэтому поместите операцию ввода в выражение while.

Поскольку ваши значения смежны, вы можете использовать операторы < и > для уменьшения количества сравнений.

Edit 1:
Другой альтернативой является размещение действительных букв в строку и поиск строки.

const std::string invalid_letters = "@.abcdefghijklmnopqrstuvwxyz"; 
while (fd >> c) 
{ 
    if (invalid_letters.find(c) == std::string::npos) 
    { 
    k[i] = c; 
    ++i; 
    } 
} 

Вы также можете использовать islower для определения строчных букв.

+1

Символьные константы обычно более * переносимы *, чем кодовые точки. Хотя это не так, потому что что-то предполагается относительно их упорядочения ... –

0

Вы можете написать, если заявление, как это:

if (int(k[i]) < 96 || int(k[i]) > 122){ 
     i++; 
    } 
0
int countemailchars(istream & is) 
{ 
    char ch; 
    int answer = 0; 
    while(is.get(&ch)) 
    { 
     if(strchr("[email protected]", tolower(ch))) 
     answer++; 
    } 

    return answer; 
} 

ifstream fd ("info.txt"); 
int N = countemailchars(fd); 
-4
int main() 
{ 
    char k[100]; 
    int j; 
    int i = 0; 
    ifstream fd("info.txt"); 
    char ch; 
    while (!in.eof()) 
    { 
     fd >> ch; 
     j = int(ch); 
     if (j != 96 || j != 97 || j != 98 || j != 99) 
     { 
      k[i] = ch; 
      i++; 
     } 

    } 
} 
+0

Уверен, что 'j' не может быть' 96' и '97' одновременно, поэтому одно из условий всегда будет истинным. –

Смежные вопросы