Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.68/22: Рейтинг темы: голосов - 22, средняя оценка - 4.68
proof
0 / 0 / 0
Регистрация: 04.08.2014
Сообщений: 4
1

Const char нельзя присвоить сущность типа char

04.08.2014, 21:48. Просмотров 4408. Ответов 24
Метки нет (Все метки)

Здравствуйте!
Начинаю изучать Си
И вот у меня немного не получается написать свою первую программу.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
 
int main()
{
 
    char n = 0;
    char r;
    system("chcp 1251 > nul");
    printf("Введите число от 0 до 99\n");
    scanf("%2d", n);
    r = n == 1 ? "копейка" : "not" ;
    printf("%d %s", n, r);
 
    return 0;
 
 
}
Интерпритатор ругается на: const char нельзя присвоить сущность типа char

Хочу попросить бывалых пояснить мне пожалуйста почему у меня сейчас возникает такая ошибка? Пояснив мне почему, я в будущем буду избегать таких ошибок!
Всем кто откликнется - очень благодарен!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2014, 21:48
Ответы с готовыми решениями:

"const char *" нельзя использовать для инициализации сущности типа "char"
/* /* Написать программу, которая показывает реальное время в выбранных городах мира. Программа...

CONST_RETURN char *__cdecl strstr (const char *_Str, const char *_SubStr)
#include &lt;stdio.h&gt; #include &lt;string.h&gt; char tracks = { &quot;ya ostavil svoe serdce v harvardskom...

Переход с 10 на 17 Студию 2440 =: невозможно преобразовать "const char [2] в char*
Доброго Нового года! Через пару дней сдавать контрольную работу, которую сделал ещё вначале...

Ошибка в коде: несовместимы типы операндов (char и const char)
Текст не содержит знаков препинания и набран одинаковым шрифтом. Составить программу определения...

Приведение char (*) [N] к const char (*) [N]
Как вообще сделать такую вещь правильно? Скажем, завёл я массив из N символов: char arr;...

24
Jewbacabra
Эксперт PHP
3923 / 3230 / 1402
Регистрация: 24.04.2014
Сообщений: 9,793
04.08.2014, 21:57 2
Цитата Сообщение от proof Посмотреть сообщение
Интерпритатор ругается на: const char нельзя присвоить сущность типа char
во первых передавать надо не переменную а ее адрес, во вторых %d подразумевает тип int
1
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
04.08.2014, 22:00 3
"это константная строка и ее нельзя изменить", "указатель на строку массив байт объявляется так: char * ptr".
0
proof
0 / 0 / 0
Регистрация: 04.08.2014
Сообщений: 4
04.08.2014, 22:41  [ТС] 4
Спасибо Что откликнулись!
во первых передавать надо не переменную а ее адрес, во вторых %d подразумевает тип int
Виноват! Спасибо исправил
C
1
2
3
4
5
6
7
8
9
int n = 0;
    char r;
    system("chcp 1251 > nul");
    printf("Введите число от 0 до 99\n");
    scanf("%2d", &n);
    r = n == 1 ? "копейка" : "not" ;
    printf("%d %s", n, r);
 
    return 0;

Но мне по прежнему не понятно что делать с этой ошибкой! Дайте пожалуйста более развернутую инфу! Можно даже на моем примере! Какие действия необходимо сделать и почему
0
04.08.2014, 22:41
Jewbacabra
Эксперт PHP
3923 / 3230 / 1402
Регистрация: 24.04.2014
Сообщений: 9,793
04.08.2014, 22:57 5
proof,
C
1
const char* r;
1
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
04.08.2014, 22:58 6
sizeof(char) равен 1 байту. Используйте указатели.
0
proof
0 / 0 / 0
Регистрация: 04.08.2014
Сообщений: 4
04.08.2014, 23:28  [ТС] 7
C
1
2
3
4
5
6
7
8
9
int n = 0;
    volatile char r;
    system("chcp 1251 > nul");
    printf("Введите число от 0 до 99\n");
    scanf("%2d", &n);
    *&r = n == 1 ? 'vvv' : 'n' ;
    printf("%d %c", n, r);
 
    return 0;
Вот как у меня получилось! Но я не знаю что значит звездочка...
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
04.08.2014, 23:36 8
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
 
int
main (int argc, char ** argv)
{
    const char * s1 = "копейка";
    const char * s2 = "not";
    char * ptr = NULL;
    int n;
    
    fscanf(stdin, "%i", &n);
    
    if (n == 1){
        ptr = s1;
    } else {
        ptr = s2;
    }
    
    fprintf(stdout, "%s\n", ptr);
    
    exit(EXIT_SUCCESS);
}
Добавлено через 1 минуту
Цитата Сообщение от proof Посмотреть сообщение
Но я не знаю что значит звездочка...
Значит рано еще работать со "строками". Это будет дальше по учебнику.
1
Vtulhu
425 / 379 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
05.08.2014, 10:32 9
C
1
printf("%d %s", n, (n == 1)? "kakaka" : "kokoko");
0
ValeryS
Модератор
7726 / 5737 / 743
Регистрация: 14.02.2011
Сообщений: 19,630
Завершенные тесты: 1
05.08.2014, 10:58 10
Цитата Сообщение от proof Посмотреть сообщение
Вот как у меня получилось!
прекрасно
но!!! нельзя так делать
Цитата Сообщение от proof Посмотреть сообщение
Но я не знаю что значит звездочка...
попытаюсь объяснить

&r взять адрес где лежит переменная r
*&r и записать что то по этому адресу
это что то число 'vvv' 0x00767676
или 'n' 0x6E
поскольку первое число всяко больше байта, то затираем память после перемененной r к чему это приведет неизвестно

тебе всего то нужно было объявить r не как char а как указатель на char(сиречь строку)
примерно так(взял листинг из первого поста и поправил)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
 
int main()
{
 
    char n = 0;
    char * r;
    system("chcp 1251 > nul");
    printf("Введите число от 0 до 99\n");
    scanf("%2d", &n);
    r = n == 1 ? "копейка" : "not" ;
    printf("%d %s", n, r);
 
    return 0;
 
 
}
1
proof
0 / 0 / 0
Регистрация: 04.08.2014
Сообщений: 4
05.08.2014, 12:19  [ТС] 11
Vtulhu

Но по моей идеи у меня должно быть много проверок с коньюнциями и дизюнкцией(ями) для того что бы определять число и правильно его склонять. По этому я вынес все в отдельную переменную!
Я просто застрял на том как выводить слово целеком! Мы на курсе этого действительно работу со строками еще не проходили! А то что я делаю - просто что бы закрепить дизюнкции и коньюнции!

ValeryS

Спасибо! Слово выводится, все нормально компилируется, но после запуска - возникает debug error
0
ValeryS
Модератор
7726 / 5737 / 743
Регистрация: 14.02.2011
Сообщений: 19,630
Завершенные тесты: 1
05.08.2014, 12:30 12
Цитата Сообщение от proof Посмотреть сообщение
Слово выводится, все нормально компилируется, но после запуска - возникает debug error
Вот из-за этого
C++
1
2
3
char n = 0;
..........
scanf("%2d", &n);
выделяешь памяти 1 байт, а пишется туда 4(размер int)
в результате рушится стек, и программе некуда возвращаться
поменяй
C++
1
char n = 0;
на
C++
1
int n = 0;
и будет тебе щастье
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
05.08.2014, 12:56 13
Цитата Сообщение от ValeryS Посмотреть сообщение
то затираем память после перемененной r к чему это приведет неизвестно
Ни к чему не приведет и ничего не затирается. В 'r' ляжет младший байт указателя на "string".
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
int
main (int argc, char ** argv)
{
    char * s = "const string";
    unsigned char n = s;
    
    fprintf(stdout, "%X --> %p\n", n, s);
    
    exit(EXIT_SUCCESS);
}
Bash
1
2
3
$ ./a.out 
94 --> 0x400694
$
Цитата Сообщение от ValeryS Посмотреть сообщение
выделяешь памяти 1 байт, а пишется туда 4(размер int)
в результате рушится стек, и программе некуда возвращаться
Замечание корректно, но ничего там нарушено не будет. Всё так же в n ляжет младший байт полученного числа.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
int
main (int argc, char ** argv)
{
    int k = 0xBAADF00D;
    char n = k;
    
    fprintf(stdout, "%2X\n", n);
    
    exit(EXIT_SUCCESS);
}
Bash
1
2
3
$ ./a.out 
0D
$
0
ValeryS
Модератор
7726 / 5737 / 743
Регистрация: 14.02.2011
Сообщений: 19,630
Завершенные тесты: 1
05.08.2014, 13:11 14
Цитата Сообщение от castorsky Посмотреть сообщение
Замечание корректно, но ничего там нарушено не будет.
как ты думаешь я проверил в отладчике или нет?
и между
C++
1
2
int k = 0xBAADF00D;
char n = k;
и
C++
1
2
3
char n;
int k = 0xBAADF00D;
n = k;
есть все таки разница
Цитата Сообщение от castorsky Посмотреть сообщение
Ни к чему не приведет и ничего не затирается. В 'r' ляжет младший байт указателя на "string".
а теперь сделай как ТС
C++
1
2
unsigned char n;
*&n = s;
здесь ведь не просто приведение, в данном случае усечение int->char
а адресная арифметика, адрес может указывать на что угодно, значит нужно явное приведение
типа
C++
1
*(char*(&n))
хотя зачем это нужно я не знаю
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
05.08.2014, 13:50 15
Цитата Сообщение от ValeryS Посмотреть сообщение
как ты думаешь я проверил в отладчике или нет?
Зачем отладчик? Яже показываю код, скомпилируйте и запустите. Да и слова Ваши противоречат здравому смыслу.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ cat ./shit.c && clang shit.c && ./a.out 
#include <stdio.h>
#include <stdlib.h>
 
int
main (int argc, char ** argv)
{
    char n;
    int k = 0xAABBCCDD;
    char m = k;
    n = k;
    
    fprintf(stdout, "hex(n) = %X\nhex(m) = %X\n", n, m);
    
    exit(EXIT_SUCCESS);
}
hex(n) = FFFFFFDD
hex(m) = FFFFFFDD
$
Цитата Сообщение от ValeryS Посмотреть сообщение
есть все таки разница
Никакой, см. выше.
Цитата Сообщение от ValeryS Посмотреть сообщение
а теперь сделай как ТС
А ТС так не делал, см пост 1. Для наглядности слегка изменю и Вы сможете согласиться с тем что говорите ерунду. Warnings удалил.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ cat ./shit.c && clang shit.c && ./a.out 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int
main (int argc, char ** argv)
{
    char *s1 = "копейка";
    char * s2 = "not";
    char ch;
    srand(time(0));
    
    ch = rand() % 2 ? s1 : s2;
    
    fprintf(stdout, "ch = %X : s1 = %X : s2 = %X\n", ch);
    
    exit(EXIT_SUCCESS);
}
ch = FFFFFFD3 : s1 = E5D4B0D3 : s2 = E5D4B0C8
$
Добавлено через 1 минуту
Ну такие мелочи как sgn опустим. Думаю тут ничего пояснять не нужно.
0
ValeryS
Модератор
7726 / 5737 / 743
Регистрация: 14.02.2011
Сообщений: 19,630
Завершенные тесты: 1
05.08.2014, 14:01 16
Цитата Сообщение от castorsky Посмотреть сообщение
Никакой, см. выше.
посмотри как переменные кладутся в стек
Цитата Сообщение от castorsky Посмотреть сообщение
Яже показываю код, скомпилируйте и запустите.
а мне зачем этот код?
вопрос был почему код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
 
int main()
{
 
    char n = 0;
    char * r;
    system("chcp 1251 > nul");
    printf("Введите число от 0 до 99\n");
    scanf("%2d", &n);
    r = n == 1 ? "копейка" : "not" ;
    printf("%d %s", n, r);
 
    return 0;
 
 
}
падает при выходе

Я ответил

Цитата Сообщение от castorsky Посмотреть сообщение
А ТС так не делал,
а кто это сделал?
Цитата Сообщение от proof Посмотреть сообщение
*&r = n == 1 ? 'vvv' : 'n' ;
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
05.08.2014, 14:21 17

Цитата Сообщение от ValeryS Посмотреть сообщение
посмотри как переменные кладутся в стек
Да хоть вприпрыжку. Какая вообще разница как они кладутся?
Цитата Сообщение от ValeryS Посмотреть сообщение
а мне зачем этот код?
Это демонстрация абсурдности следующих Ваших утвердений:
Цитата Сообщение от ValeryS Посмотреть сообщение
поскольку первое число всяко больше байта, то затираем память после перемененной r к чему это приведет неизвестно
Цитата Сообщение от ValeryS Посмотреть сообщение
выделяешь памяти 1 байт, а пишется туда 4(размер int)
в результате рушится стек, и программе некуда возвращаться
Цитата Сообщение от ValeryS Посмотреть сообщение
вопрос был почему код
Да потому что в printf ожидается указатель на строку, а передается байт. Конечно при этом валится стек, чего там еще ожидать. Но совсем не потому что объясняли Вы.
0
ValeryS
Модератор
7726 / 5737 / 743
Регистрация: 14.02.2011
Сообщений: 19,630
Завершенные тесты: 1
05.08.2014, 15:05 18
Цитата Сообщение от castorsky Посмотреть сообщение
Да потому что в printf ожидается указатель на строку, а передается байт.
Мне еще раз код привести?
Цитата Сообщение от ValeryS Посмотреть сообщение
char * r;
Цитата Сообщение от ValeryS Посмотреть сообщение
printf("%d %s", n, r);
где тут байт?
возми код скомпилируй и ответь на вопрос почему он валится
Цитата Сообщение от castorsky Посмотреть сообщение
Это демонстрация абсурдности следующих Ваших утвердений:
попробуй поработать с указателями
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10494 / 6202 / 1559
Регистрация: 25.07.2009
Сообщений: 11,806
05.08.2014, 15:06 19
Куда-то вас, друзья, не в ту степь унесло. Всё проще:
C
1
2
char c;
scanf("%hhd", &c);
0
ValeryS
Модератор
7726 / 5737 / 743
Регистрация: 14.02.2011
Сообщений: 19,630
Завершенные тесты: 1
05.08.2014, 15:47 20
easybudda,
ну так все правильно
scanf ждет байт("%hhd") и по памяти которой выделено байт все корректно записывается
но все меняется когда
C++
1
2
char n = 0;
 scanf("%2d", n);
scanf ждет 4 байта и запихивает их в один
0
05.08.2014, 15:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2014, 15:47

Error cannot convert 'int*' to 'const char*'
Сама задача: Описать структуру с именем NOTE, содержащую следующие поля: -фамилия, имя; -номер...

Too many arguments to function `int puts (const char*)'
Не получается скомпилировать код(компилятор dev c++).Открывает новую вкладку Stdio.h и выдает...

Не могу исправить ошибку cannot convert 'int ' to 'const char *'
Добрый день! Задание состоит в том, что задав структуру Recipe(рецепт) полям которой есть: название...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru