Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2017, 14:51   #1
Daniela Daniela
Пользователь
 
Регистрация: 24.11.2017
Сообщений: 11
По умолчанию Помогите найти баг в коде (язык С, шифр Цезаря)

Добрый день!
Получила задание написать программу для шифровки текста (шифр Цезаря).
С этим вроде бы проблем не возникло, но при запуске программы к буквам нижнего регистра почему-то добавляется еще какой-то символ.

Код
Код:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

int main (int argc, string argv[])
{
    if (argc !=2)
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }

    int key = atoi(argv[1]);
    string s = get_string();

    for (int i=0, n=strlen(s); i<n ; i++ )
    {
        if (isalpha (s[i]) && islower (s[i]))
        {
            printf("%c", tolower(((s[i]-97+key)%26)+97));
        }
        if (isalpha (s[i]) && isprint(s[i]))
        {
            printf("%c", (((s[i]-65+key)%26)+65));
        }
        if (ispunct (s[i]) || isspace (s[i]))
        {
            printf ("%c", s[i]);
        }
    }
    printf("\n");
}
после запуска с ключем 0 (для проверки) выдает:
~/workspace/pset2/ $ ./caesar 0
ABC abc
ABC aGbHcI

Откуда взялись дополнительные символы??? Где я ошиблась?

П.С.
Не по теме: что значит сообщение
Ошибка в программном коде: 'ascii' codec can't encode characters in position 109-116: ordinal not in range(128)
Daniela Daniela вне форума Ответить с цитированием
Старый 24.11.2017, 18:26   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Одни if и ни одного else. Для маленьких букв выполняются оба куска - и для больших, и для маленьких
Black Fregat вне форума Ответить с цитированием
Старый 24.11.2017, 20:34   #3
Daniela Daniela
Пользователь
 
Регистрация: 24.11.2017
Сообщений: 11
По умолчанию

Спасибо за ответ!
else нет, т.к. если условие не выполняется, то цикл завершается и программа переходит к следующему (во всяком случае, так объясняют на лекции)

Разделила проверку условия: if (isalpha (s[i]) ) и потом внутри две проверки отдельно if (islower (s[i])) и if (isupper(s[i]))
ООО чудо! Заработало!

Но теперь при проверке выдает сообщение (проверяется не человеком, а автоматически компом):
Результат теста - неверно.
Ошибки:
encrypts "a" as "b" using 1 as key
expected prompt for input, found none
encrypts "barfoo" as "yxocll" using 23 as key
expected prompt for input, found none
encrypts "BARFOO" as "EDUIRR" using 3 as key
expected prompt for input, found none
encrypts "BaRFoo" as "FeVJss" using 4 as key
expected prompt for input, found none
encrypts "barfoo" as "onesbb" using 65 as key
expected prompt for input, found none

Что значит "ожидаемое приглашение для ввода, не найдено ни одного"?
Я в отчаянии...
Daniela Daniela вне форума Ответить с цитированием
Старый 24.11.2017, 20:47   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Только то, что написано. Очевидно тестирующая система ждет какой-то строки - приглашения для ввода, типа >. Но не находит и тст проваливается.

Кстати, кто вам сказал, что у мейна в параметрах стринг?
p51x вне форума Ответить с цитированием
Старый 24.11.2017, 21:04   #5
Daniela Daniela
Пользователь
 
Регистрация: 24.11.2017
Сообщений: 11
По умолчанию

Может я неправильно поняла задание?
Цитата: "ваша цель состоит в том, чтобы написать в caesar.c программу, которая шифрует сообщение с помощью шифра Цезаря. Программа должна принимать один аргумент командной строки: неотрицательное целое число. Если вашу программу запускают без каких-либо данных командной строки, или более чем одним аргументом, должно появляться сообщение об ошибке и возвращаться значение 1 (что в данном случае означает ошибку) как указано ниже:
return 1;
В противном случае, программа должна перейти к запросу текста, который нужно зашифровать; символы, которые не являются буквами алфавита, будут выведены без изменений. После вывода зашифрованного текста программа должна завершиться, main должен вернуть 0 следующим образом:
return 0. "

Так как мы автоматизируем для вас некоторые тесты, программа должна вести себя как показано ниже. Считаем, что подчеркнутый текст это то, что набрал пользователь.
~/Dropbox/pset2: ./caesar 13

Be sure to drink your Ovaltine!

Or fher gb qevax lbhe Binygvar!


у меня все именно так и выводится.

По поводу стринг - так задано изначально ("так как эта программа должна стартовать с того, что в командной строке она должна принять значение k, в main надо прописать:

int main (int argc, string argv [])
")
Daniela Daniela вне форума Ответить с цитированием
Старый 24.11.2017, 21:41   #6
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Действительно, непонятно, какой промпт ожидается.
Судя по примеру, может быть, перевод строки?
Black Fregat вне форума Ответить с цитированием
Старый 24.11.2017, 22:14   #7
Daniela Daniela
Пользователь
 
Регистрация: 24.11.2017
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Судя по примеру, может быть, перевод строки?
Что значит "перевод строки"? это \n ? так вроде бы ж есть... или еще где-то нужно?

Извините за такие вопросы, просто тяжело быть "чайником" , а хочется понять в чем ошибка

И, если не сложно, объясните что может значить сообщение (не из этого задания):
"Ошибка в программном коде: 'ascii' codec can't encode characters in position 109-116: ordinal not in range(128)"
Daniela Daniela вне форума Ответить с цитированием
Старый 25.11.2017, 00:23   #8
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Что именно не так с Вашим заданием - непонятно. Если не у кого проконсультироваться, можно толко попытаться подобрать. Попробуйте таки вывести хоть какой-то текст перед вводом строки. Возможны варианты: просто перевод строки, какой-то текст с переводом строки (например, как предлагали, ">"), текст без перевода строки.
Цитата:
Сообщение от Daniela Daniela Посмотреть сообщение
"Ошибка в программном коде: 'ascii' codec can't encode characters in position 109-116: ordinal not in range(128)"
Эта ошибка означает, что где-то в позициях 109-116 ожидаются символы чисто ascii, а на самом деле стоят символы с кодом больше 127, скорее всего, русские буквы
Black Fregat вне форума Ответить с цитированием
Старый 25.11.2017, 17:52   #9
Daniela Daniela
Пользователь
 
Регистрация: 24.11.2017
Сообщений: 11
По умолчанию

Я его победила! Спасибо Вам за помощь.
Подбирала пол дня. В итоге тест прошел, когда я вывела текст перед вводом пользователя и вывела текст перед ответом!
Вот так получилось:
~/workspace/pset2/ $ ./caesar 0
plaintext: abc ABC!
ciphertext: abc ABC!
~/workspace/pset2/ $ ./caesar 13
plaintext: abc ABC!
ciphertext: nop NOP!

П.С. по поводу ascii: это мне нужно создать новую тему , чтоб выяснить ошибку ? (суть задачи из этой же темы: запросить ФИО пользователя и вывести инициалы большими буквами)
Daniela Daniela вне форума Ответить с цитированием
Старый 26.11.2017, 01:38   #10
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Daniela Daniela Посмотреть сообщение
это мне нужно создать новую тему , чтоб выяснить ошибку ?
Не знаю..
Цитата:
Сообщение от Daniela Daniela Посмотреть сообщение
запросить ФИО пользователя и вывести инициалы большими буквами
Напишите подробнее, где именно ошибка.
Может, комментарии русскими буквами? Иногда и на это бывает ошибка
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифр Цезаря Ти6ка C# (си шарп) 7 21.02.2017 22:19
[C++]: шифр Гронсфельда. Помогите найти ошибку в коде krasy Помощь студентам 1 02.10.2016 00:37
Шифр цезаря noutiluss C# (си шарп) 0 17.03.2016 17:35
Шифр Цезаря.(Зашиф-ка,расшиф-ка,взлом...Вообщем полный набор.Пожалуйста помогите) Александр96 Помощь студентам 0 03.12.2013 18:36
Шифр Цезаря Goracio Помощь студентам 1 19.04.2010 14:53