String

народ я вот решаю задачу .. вводишь в файл input.txt латинскую букву...а в файл output.txt выводить должно справа стоящую на клавиатури букву.вот код:
#include <fstream>
#include <string>
using namespace std;
main ()
{
     string kla("qwertyuiopasdfghjklzxcvbnmq");
     string s("");
     int i;
     
     ifstream in("input.txt");
     in>>s;
     in.close();
     ofstream out("output.txt");
     int t=kla.length();
     int is;
     for (i=0;i<t;i++)
     {
         if(kla[i]=s[0])
         {
                        is=i;
                        }
                        }
                        out<<kla[is+1];
    
                       
                       return 0;
                       
                       }
у мя выводит квадратик . в чем ошибка?
10 ответов

для начала это
if(kla[i]=s[0])
заменить на
if(kla[i]==s[0])


18 строка - "==", а не "=".


народ я вот решаю задачу .. вводишь в файл input.txt латинскую букву...а в файл output.txt выводить должно справа стоящую на клавиатури букву.вот код:
#include <fstream>
#include <string>
using namespace std;
main ()
{
     string kla("qwertyuiopasdfghjklzxcvbnmq");
     string s("");
     int i;
     
     ifstream in("input.txt");
     in>>s;
     in.close();
     ofstream out("output.txt");
     int t=kla.length();
     int is;
     for (i=0;i<t;i++)
     {
         if(kla[i]=s[0])
         {
                        is=i;
                        }
                        }
                        out<<kla[is+1];
    
                       
                       return 0;
                       
                       }
у мя выводит квадратик . в чем ошибка?
Если я правильно разглядел, то вы вместо оператора равенства ( == ) используете оператор присваивания ( = ) в выражении
 if(kla[i]=s[0])


спасибо большое)) незаметил))если q ввести не пашит((


Потому что после того, как найдено совпадение, нужно выходить из цикла. Иначе вы найдёте первую q, пойдёте в цикле дальше по списку букв, найдёте последнюю q, завершите цикл (потому как пройдена вся строка) и попытаетесь вывести следующую за найденным индексом букву. Но была найдена последняя буква в строке (второе вхождение q), и is + 1 находится за границами строки, там мусор. Он и выводится.


спасибо большое)) незаметил))если q ввести не пашит((
А что вы хотите, чтобы у вас выдало, если вы введете 'q'? За последней 'q' в вашей строке ничего не следует. То есть вы выходите за границы своего контейнера string klaИзмените свою программу следующим образом: вместо цикла используете метод find класса string
std:;size_t i = kla.find( s[0] );
 
if ( i < rla.size() - 1 )  out << kla[i+1];


А что вы хотите, чтобы у вас выдало, если вы введете 'q'? За последней 'q' в вашей строке ничего не следует. То есть вы выходите за границы своего контейнера string klaИзмените свою программу следующим образом: вместо цикла используете метод find класса string
std:;size_t i = kla.find( s[0] );
 
if ( i < rla.size() - 1 )  out << kla[i+1];
мне мало просто изменить)) мне понять хочеться))
Потому что после того, как найдено совпадение, нужно выходить из цикла. Иначе вы найдёте первую q, пойдёте в цикле дальше по списку букв, найдёте последнюю q, завершите цикл (потому как пройдена вся строка) и попытаетесь вывести следующую за найденным индексом букву. Но была найдена последняя буква в строке (второе вхождение q), и is + 1 находится за границами строки, там мусор. Он и выводится.
а как произвести выход из цикла?)


Ferk, оператор break. Надо сделать так:
for (i=0;i<t;i++)
{
    if(kla[i]==s[0])
    {
        is=i;
 
        break;
    }
}


break?спасибо)) все понял))


И все равно вам надо делать проверку, что 1) вы нашли нужный символ; 2) найденный символ не является последним в строке. Конечно в вашем случае найденный символ не будет последним в строке, так как, как я вижу, символ 'q' у вас в строке дублируется, но тем не менее для обощения, когда задается произвольная строка, такую проверку сделать целесообразно. Поэтому даже если делать в цикле, как это сделано у вас, то все равно его следует изменить
int is, t ;
 
for ( is = 0, t = kla.length() ; is < t; ++is )
{
   if ( kla[is] == s[0] ) break;
}
 
if ( is < kla.length() - 1 ) out << kla[is+1];