LINUX.ORG.RU

char = char * char как?!


1

1

Доброго времени суток! Есть задание на С, надо просто вывести на экран чар, как произведение двух чаров. Пример:

char a,b,c;

int main (){

printf(«%c», a);

printf(«%c», b);

c=a*b;

printf(«%c», c);

}

После первого printf консоль вылетает, что-то не так, но getchar работает, хмм. Поскольку конечное значение char, то после перемножения, он выдает не число интегером, а символы. Как присвоить чару, модуль произведия двух чаров, не изменяя его тип данных, то есть сохранить формат char?

Спасибо!



Последнее исправление: maxylopes (всего исправлений: 1)

Пиши на питоне, там такое можно.

anonymous
()
Ответ на: комментарий от anonymous

Ага, ты очень пунктуален.

Read the two values to be multiplied from the keyboard. • char.c: the values to be multiplied are chars and the result is a char

maxylopes
() автор топика
Ответ на: комментарий от hexdump01010101

Точно! Вот, что я искал, спасибо огромное! Очень плохо, что я начал с С++, понятия не имею как юзать значения в ковычках, как они называются? Хочу подучить теорию.

maxylopes
() автор топика
Ответ на: комментарий от maxylopes

Очень плохо, что я начал с С++

Если вы намекаете, на изучение python, то нет, вы всё сделали почти правильно, за исключением, того, что нужно было брать чистый Си, а не C++. Вот тут почитайте: Как правильно учить Python? (комментарий)

понятия не имею как юзать значения в ковычках, как они называются

Format directives. Наберите 'man 3 printf', там будут расписаны все директивы формат-строки.

hexdump01010101
()

Есть задание на С, надо просто вывести на экран чар, как произведение двух чаров

Если я правильно понял, то с минимальным допилом то, что требуется:

#include <stdio.h>
#include <stdlib.h>

int main() {
    char a = 'a';
    char b = 'b';
    char c = a * b;

    printf("a: %c\n", a);
    printf("b: %c\n", b);
    printf("c: %c (0x%x)\n", c, c);

    return EXIT_SUCCESS;
}
KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun
char c;
...
printf("c: %c (0x%x)\n", c, c);

Попробуйте найти ошибку в вашем примере (и вопрос на засыпку: почему оно вообще не падает в сегфолт, скажем :-) Вот для подсказки:

/tmp$ cat c.c
#include <stdio.h>
#include <stdlib.h>

int main() {
    char a = 1;
    char b = -1;
    char c = a * b;

    printf("a: %c\n", a);
    printf("b: %c\n", b);
    printf("c: %c (0x%x) %hhx %u %hhu\n", c, c, c, c, c);

    return EXIT_SUCCESS;
}
/tmp$ /usr/bin/make c && ./c
cc     c.c   -o c
a: 
b: �
c: � (0xffffffff) ff 4294967295 255
hexdump01010101
()
Ответ на: комментарий от maxylopes

чар >=0;

'char' может быть как signed так и unsigned, это зависит от архитектуры (эта особенность именно char). В большинстве случаев char signed, а значит вполне может уйти в минус.

hexdump01010101
()
Ответ на: комментарий от hexdump01010101

у меня мозг кипит, теперь получаю всяческие символы вместо значений сканф! :( Как я понимаю это из-за того, что само значение переменной чар, а при вводе я набираю неверный формат, так?

maxylopes
() автор топика
Ответ на: комментарий от maxylopes

чар >=0;

спорное утрверждение

а ещё man getchar, там он int возвращает

dimon555 ★★★★★
()
Ответ на: комментарий от hexdump01010101

да, тут моя ошибка, плохо интервал обозначил, но мне бы пока без знака разобраться! :)

maxylopes
() автор топика
Ответ на: комментарий от hexdump01010101

Если имеется ввиду

1 * -1 == -1 == (unsigned char)255 == hex(0xff) == bin(11111111)

То понятно, что для signed арифметики (в обратной записи) 0xff экстраполируется в 0xff..ff при приведении типов char -> (signed) int:

(signed char) -1 == 0xff
(signed int) -1 == 0xff..ff 

Но я ума не приложу, откуда там сегфолту взяться? Нужны еще наводки :)

P.S. Про формат hh и h знаю.

KennyMinigun ★★★★★
()
Ответ на: комментарий от hexdump01010101

А прошу прощения. Может быть неправильный указатель на верхушку стека при выходе из printf.

Но на х86 это маловероятно, т.к. размер слова 4+ байта, а аргументы выравниваются по словно.

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

А прошу прощения. Может быть неправильный указатель на верхушку стека при выходе из printf.

Нет, в данном случае вас спас 'integral promotion': всё что меньше int будет сконвертировано в int, если тип аргумента из прототипа функции вывести невозможно.

7.12.1.2 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n802.pdf

Именно поэтому-то мой вопрос был почему сегфолта как раз невозможно (но зато printf печатает явно неправильные значения для типа char). ;-) А вот если бы вы пытались int вместо long long подсунуть (или наоборот), то тут да, могли начаться проблемы со стэком и всем остальным.

hexdump01010101
()

Убейся. Ты даже не школота - не дотягиваешь.

anonymous
()
#include <stdio.h>
char a,b,c;

int main (){
   printf("%c", a);
   printf("%c", b);
   c=(char)((int)a*(int)b);
   printf("%c", c);
}
enep ★★★★★
()

Ладно, хрен с ним, невообразимо идиотским по сущности техзаданием. Но каким хреном ТС собирается getchar'ом получать множители? Япона мать! Да даже у пробела код == 32!!! А максимальное число, позволяющее еще получить char при возведении в квадрат, == 15!!!

Присоединяюсь к анониму.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

У меня тут таких задачек 15 штук. В том числе и «посложнее», такие как определение високосного года. Но я просто не понимаю как чар * чар может быть чар. Сегодня выложу готовый код.

maxylopes
() автор топика
Ответ на: комментарий от maxylopes

У меня тут таких задачек 15 штук.

Выкладывай на глагне, в новостях.

pacify ★★★★★
()
Ответ на: комментарий от Norgat

Тогда на кой хрен вообще умножение выполнять? Сделать XOR — и хрен с ним! ☺

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Kalashnikov
yaourt -S libastral

Обновленная версия libastral.so показывает, что ты прав. А ТС явно что-то мутит.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Kalashnikov

именно это и требовалось! #include «stdio.h»

void main()

{

char value1,value2,result;

printf(«Input the two CHAR values that are to be multiplied: \n»);

scanf(«%c %c»,&value1, &value2); //scanf(«%c%*c»,&value1);

//scanf(«%c%*c»,&value2);

value1 = value1 - '0';

value2 = value2 - '0';

result=value1*value2;

printf(«The result is: %i», result);

}

maxylopes
() автор топика
Ответ на: комментарий от Eddy_Em

Это не требуется, но да действительно поработаю над этим.

maxylopes
() автор топика
Ответ на: комментарий от Eddy_Em

alt+[номер символа в десятичной системе счисления на цифровой клавиатуре]

anonymous
()
Ответ на: комментарий от maxylopes

1) где инициализация переменных? 2) а что такое диапазоны? это у тебя на тетрадке можно любое число писать, а переменные имеют свои максимальные пределы значений

I-Love-Microsoft ★★★★★
()

Господи, ну почитай ты K&R, ссылку на pdf даже давали.
Это тебе даст кучу времени экономии, понимание написанного и отсутствие головной боли посетителей данного сайта.

Solace ★★
()
Ответ на: комментарий от maxylopes

что значит не присвоить? при бинарной операции чары продвигаются до интов. и насрать, чему ты присваиваешь результат произведения. присвоишь чару - произойдет невное приведение инта к чару с возможным переполнением последнего. и это не «возможно», это факт.

vvviperrr ★★★★★
()
Ответ на: комментарий от vvviperrr

char, short, все продвигается до int

бред. Ты про какой ЯП вообще?

В C/C++ всё «продвигается» до того, что продвигается.

char z = x * y;

«продвигается» до char, не зависимо от того, что такое x,y. Даже если это матрицы.

drBatty ★★
()
Ответ на: комментарий от maxylopes

Если произведению, не присвоить тип то возможно и так.

твой мозг заражён каким-то бэйсиком (питоном?).

В C/C++ просто НЕТ переменных без типа. Это невозможно. Есть только указатель ниначто, NULL называется. Он никуда не указывает.

drBatty ★★
()
Ответ на: комментарий от vvviperrr

что значит не присвоить? при бинарной операции чары продвигаются до интов.

иди, учи матчасть, и не путай новичков.

drBatty ★★
()
Ответ на: комментарий от drBatty

при бинарной операции чары продвигаются до интов.

иди, учи матчасть, и не путай новичков.

У меня для вас плохие новости. ;-) Типы продвигаются до наибольшего типа в выражении, а потом, при необходимости, приводятся к lvalue, за исключением типов меньших int — они всегда приводятся к int перед арифметическими операциями над ними.

https://www.securecoding.cert.org/confluence/display/seccode/INT02-C. Underst...

/tmp$ cat c.c
#include <stdio.h>

int main()
{
        char c;
        short s;
        int i;
        long long l;
        float f;
        double d;

        printf("%lu %lu %lu %lu %lu %lu %lu\n",
                sizeof(c),
                sizeof(c * c + c),
                sizeof(s * c + c),
                sizeof(i * c + c),
                sizeof(l * c + c),
                sizeof(f * c + c),
                sizeof(d * c + c));

        f = 2/3;
        d = 2.0/3;
        c = 100;

        printf("%d %hhd %f %lf\n",
                c * c, (char)(c * c),
                f, d);
        return 0;
}
/tmp$ gcc -Wall c.c && ./a.out 
1 4 4 4 8 4 8
10000 16 0.000000 0.666667
hexdump01010101
()
Ответ на: комментарий от hexdump01010101

Буду педантом, поправка: в printf() для примера с double достаточно %f, так как в эллипсисе и так всё продвигается до double, а посему отдельного float типа printf вообще не знает. ;-)

hexdump01010101
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.