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

Строковые константы - Too many initializers for 'char []'

24.08.2015, 09:50. Просмотров 2558. Ответов 14
Метки нет (Все метки)

P.S плохо с русским

Парни кто может мне помочи....со строковыми константы вроде я чегота не понемаю Нижу приведу пример моего кода но вот както он не работает
C
1
2
3
4
5
6
7
void main()
{
  char *str[] = {"This is","Char constant",NULL};
  char *p;
  p = str;
  printf("%c\n",p[1]);
}
Но выдаёт ошибку :
C:\C\test2.c: In function 'int main()':
C:\C\test2.c:5:42: error: too many initializers for 'char []'
char str[] = {"This is","Char constant"};
^
[Finished in 0.2s with exit code 1]

Или так : что тоже ошибка

########## - 2
C
1
2
3
4
5
void main()
{
  char str[] = {"This is","Char constant",NULL};
  printf("%c\n",str[1]);
}
Код ошибки #2
C:\C\test2.c: In function 'int main()':
C:\C\test2.c:5:42: error: too many initializers for 'char []'
char str[] = {"This is","Char constant"};
^
[Finished in 0.2s with exit code 1]

-------------------------------

В чем проблема?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2015, 09:50
Ответы с готовыми решениями:

Строковые константы и указатели
Здравствуйте. Не работает следующий код из книги "С++. Шаг за шагом" (Дейтел): #include "pch.h"...

Как задаются строковые константы?
Можете привести примеры

Как/где размещаются строковые константы
вызываю какую нибудь функцию и передаю туда текст, например myfunc("some text") когда выделяется...

Зачем в jvm нужны строковые константы
Пишу небольшую jvm (не очень строго соблюдая спецификацию) и компилятор под это дело. Столкнулся с...

Где в АРМах хранить строковые константы?
Подскажите пожалста, где в АРМах хранить строковые константы? И вооще, может статью в сообщество...

14
Jewbacabra
Эксперт PHP
3785 / 3120 / 1371
Регистрация: 24.04.2014
Сообщений: 9,482
24.08.2015, 09:58 2
C
1
2
3
4
5
int main() {
    const char* str[] = {"this is", "String constant"};
    printf("%s\n", str[1]);
    return 0;
}
1
Velesthau
524 / 427 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
24.08.2015, 09:59 3
Цитата Сообщение от vpavlov79 Посмотреть сообщение
В чем проблема?
В том, что ты объявляешь массив char, а инициализировать пытаешься массивом указателей.
Либо так:
C
1
char str[] = {'a','b','c'};
либо так:
C
1
char str[] = "This is char constant";
1
vpavlov79
0 / 0 / 0
Регистрация: 24.08.2015
Сообщений: 7
24.08.2015, 10:06  [ТС] 4
Velesthau,
Jewbacabra
Почему этот код в стандарте Си .....и тоже не работает

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
 
char *p = "тестовая строка";
 
int main(void)
{
  register int t;
 
  /* печать строки слева направо и справа налево */
  printf(p);
  for(t=strlen(p)-1; t>-1; t--) printf("%c", p[t]);
 
  return 0;
}
Код ошибки
C:\C\test2.c:4:11: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
char *p = "test string";

так почему они говорят что работает
0
Velesthau
524 / 427 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
24.08.2015, 10:16 5
Цитата Сообщение от vpavlov79 Посмотреть сообщение
так почему они говорят что работает
Он компилируется, но предупреждает, что "тестовая строка" - это неизменяемая строка (string constant), а p в это коде - указатель на строку, которую компилятор считает, что можно менять. Потом получишься ошибку на стадии работы программы, если через p попытаешься поменять строку (например, сделаешь p[1] = 'a'.
Если ты сделаешь
C
1
const char *p = "тестовая строка";
, то предупреждение должно уйти и при попытке поменять строку через p, ты увидишь ошибку еще на стадии компиляции, а не при запуске, что будет правильней, так как убережет от проблем во время запуска.
0
drfaust
334 / 220 / 80
Регистрация: 02.10.2008
Сообщений: 853
Записей в блоге: 1
Завершенные тесты: 1
24.08.2015, 10:19 6
Компилер выдал предупреждение на неявное преобразование char* в const char*
Внимательно смотрим на определение int printf(const char *format, ...);
Код должен скомпилироватся и корректно отработать (хотя может есть косяки, которые я не увидел)
0
Velesthau
524 / 427 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
24.08.2015, 10:22 7
Цитата Сообщение от drfaust Посмотреть сообщение
Компилер выдал предупреждение на неявное преобразование char* в const char*
Наоборот должно быть сделать указатель константным - это частая практика, чтобы обезопасить себя от случайного изменения, и ошибкой не является.
0
vpavlov79
0 / 0 / 0
Регистрация: 24.08.2015
Сообщений: 7
24.08.2015, 10:35  [ТС] 8
Velesthau,
Можеш обияснить как работает вот такая конструкция
Ну например я этот код понимаю
#1
C
1
2
3
4
 char str[10],*p;
str[2] = 123;
p = &str[2];
printf("%d",*p);
Или Так
#2
C
1
2
3
4
 char str[10],*p;
p = str;
p[2] = 123;
printf("%d",*(p+2));
Вот как я понимаю эти два кода
Код #1
p не инициализировается но в p я добовляю адрес str[2]
потом вывожу значение переменои p с помошю *
Код #2
и без слов понятно
НО вотиногда некоторые пишут так
*p = i // i из цикла
или так
*p = 2;
---------
*p = "string constant";

Но вот что значет эти все выражение разве * это не значет получять значение катори лежит по адресу 0x....;
Можеш обяснить пока что это меня не дает покоя по ночям
0
Velesthau
524 / 427 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
24.08.2015, 10:55 9
Цитата Сообщение от vpavlov79 Посмотреть сообщение
НО вотиногда некоторые пишут так
*p = i // i из цикла
или так
*p = 2;
---------
*p = "string constant";
Но вот что значет эти все выражение разве * это не значет получять значение катори лежит по адресу 0x....;
При объявлении - нет, это не получать значение, а инициализировать указатель. Так же как через указатель должно же получаться менять значение, на которое указывает он. Так же через *p.
0
vpavlov79
0 / 0 / 0
Регистрация: 24.08.2015
Сообщений: 7
24.08.2015, 11:11  [ТС] 10
Velesthau,
прости но я тебя не понел
есль напистаи так char *p = 2; // хотя это выдаст ошибку int не может быть преоброзован в char * тем более будет потеряно 6 byte еслт будет толька int->char без char * .. но допустем
то жто значет я инициарищировал укзатель *p со значением 2;
тоесть выражение char a = &p; // вернет адрес где лежит двоика
а выражение printf(p); // вернет 2

Добавлено через 8 минут
Вот этот код дает ошибку
C
1
2
3
4
5
6
 char *p ='A';
 int main()
{
  printf("%c",p); // error invalid conversion from 'char' to 'char*' [-fpermissive] char *p = 'A';
   printf(p); // error...
}
При int также....
Но выражение ранише char *p = "string constant";
printf(p); //толька предупреждение
В чем проблема
0
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
24.08.2015, 11:23 11
C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(int argc,char** argv)
{
   char*    p = "A";
 
   printf("%s <<-- %p",p,p);
   
   return 0;
}
0
Миниатюры
Строковые константы - Too many initializers for 'char []'  
Velesthau
524 / 427 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
24.08.2015, 11:40 12
Цитата Сообщение от vpavlov79 Посмотреть сообщение
то жто значет я инициарищировал укзатель *p со значением 2;
Значит, указатель будет указывать на адрес 2.
Цитата Сообщение от vpavlov79 Посмотреть сообщение
тоесть выражение char a = &p; // вернет адрес где лежит двоика
Если указатель p указывает на адрес 2, то да &p вернет адрес указателя. То есть, двойки, в случае если p=2.
0
vpavlov79
0 / 0 / 0
Регистрация: 24.08.2015
Сообщений: 7
24.08.2015, 12:58  [ТС] 13
Velesthau, а как насчет строк....char *p = "string"; что вернет в это случее указатель адрес string...тоесть адрес там где лежит это строка.....от этих указателеи у меня головокружение
0
Velesthau
524 / 427 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
24.08.2015, 13:30 14
Цитата Сообщение от vpavlov79 Посмотреть сообщение
что вернет в это случее указатель адрес string...тоесть адрес там где лежит это строка
Я не понял формулировки вопроса.
p содержит адрес "string"
&p это адрес переменной-указателя, которая содержит адрес "string".
0
vpavlov79
0 / 0 / 0
Регистрация: 24.08.2015
Сообщений: 7
24.08.2015, 15:27  [ТС] 15
Velesthau,
ну вы сказали что *p = 2; то это значет что указатель указывет на адрес 2
значет *p = "string"; содержит адресс string....тоечсть вместо 0x... будет string так....
тогда получается так что *p = string; // адрес указателя p под названием string
тогда &p вернет адрес string;
я так понел то что с права от указателя это не его значение а адрес но при вызове мы видем типа ка резултат присваивание чего либо указателю но на самом деле это адрес
ну например *p = "string";
printf(p); // мы увидем это как результат но это адрес указателя p так....все правелино
0
24.08.2015, 15:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2015, 15:27

Комбинаторно- вероятностный смысл константы пи, гамма функция и обобщение константы пи
Добавлено через 33 минуты Известна формула для выражения \pi, ...

Инициализация массива структур: Array initializers can only be used in a variable or field initializer
В С++ можно создать массив стркутур и тут же ее проинициализировать: struct AmplPalette ...

Char unsigned char signed char длинна Кааак
Здравствуйте. char l = {0,0}; l = 0xff; Почему, меня, компилятор не посылает куда...


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

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

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