Разобрать небольшой код - C (СИ)

  1. C1 2 3 4 5 6 7 8 9 #include<stdio.h>   void main() {     char *s1="abcdfse";       printf("%s \n", s1[3]);     }Не могу понять, так как s1 это массив символов,и одновременно это указатель на адрес первого символа в данной строке, то почему программа вылетает когда я хочу распечатать 4 символ? Понятно, что виноват я, а не компилятор , но вот найти ошибки никак не могу Может дело в неправильном понимании того, что я делаю?...Огромная просьба разъяснить мне этот вопрос.


textual

Код:

printf("%c \n", s1[3]);


Похожие ответы
  1. Написал в виде теста:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include #include   int main () {     char ch;     while((ch = getchar()) != '&') {         switch(toupper(ch)) {             case 'A': printf("Ator\n");                     break;             case 'B': printf("Bob\n");                     break;             case 'C': printf("Cooooo\n");                     break;             default : printf("last\n");         }     }        return 0; } Выводит в консоль при 'а' - Ator и last. Почему? Думал, что у меня с компилятором не то (gcc), на онлайн ресурсе результат такой же. Почему он не пропускает case default? Заранее спасибо, я пока новичек.

  1. C++1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include #include #include #define c 0.7 int main() {     float x,y;     x = 2 * c - sin(3 * c + 2);     if (x > 0) && y = pow(sqrt(fabs(x))3)-1;     else if (x = 0) && y = exp(x*Ln(10))/7;     else y = sqr(sin)*3*x;     printf("function y=%5.3f\n",y);     return 0; }Не работает, не могу понять почему, подскажите пожалуйста, буду благодарен)

  1. Доброго времени суток.В матрице нужно найти строку в которой элементы упорядоченны по возрастанию, не могу правильно оформить цикл, помогите плз(Если возможно через динамический массив), спасибо.C1 2 3 4 5 6 7 8 9 10 11 12  for(i = 0; i < n; i++)     {         for(j = 0; j < m-1; j++)         {             if(*(a+i*m+j) < *(a+i*m+j+1) && i != n)                 index_i = i;             break;         }           }

  1. Почему если я x+=0.1 ставлю вначале цикла то все норм работает, только вот значение в точке х=1 оно пропускает(ну понятно почему) А вот если я ставлю x+=0.1 вконце цикла, то оно после х=5 больше не выводит значений В for же все работает отлично.

  1. Правильно ли я понимаю: когда мы используем массив, в примере ниже, то литерал копируется в массив, тем самым создаться копия литерала.C1    char arr[] = "Hello.";Когда используем указатель, то создается переменная-указатель, которая указывает на литерал.C1  char *arr  = "Hello.";Так как копии литерала не создается, то работа с указателем требует мелешь затрат оперативной памяти ?? или разницы нет ??

  1. Добрый день, у меня в этой функции действие одного getchar залезает на действие другого. Код ниже. В первом гетчар мы получаем 2 символа 'o' и '\n'. И потом идет проверка на '\n' и мы не попадаем во второй цикл. Как решить такую проблему? Может что то вместо гетчар использовать? Заранее спасибо.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15     char k = 'a';     while (k != 'r' || k != 'o')     {         printf("\nDo you want random or your own key? Press r or o:\n");         k = getchar();             //тут мы получается получаем 2 символа 'o' и '\n'             if (k == 'o')          //здесь срабатывает 'o'             {                 puts("\nVvedite key.");                 char u;                 int b = 0;                 while ((u = getchar()) != '\n')  //здесь '\n' и мы не попадаем в этот цикл.                     key[b++] = u;                 key[b++] = '\0';                     }     }

  1. Написал программу:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include   int main(int argc, char ** argv) {     long n;     scanf("%l", &n);     long x, a[n], i;     scanf("%l", &x);     for (i=n; i>=0; i++) scanf("%l", &a[i]);     long p1, p2;     p1=a[n];     for (i=n; i>0; i++) p1=p1*x+a[i-1];     printf("%l", p1);     return 0; }А в компиляторе выводит ошибки: Кликните здесь для просмотра всего текста polynom.c: In function 'main': polynom.c:6:8: warning: conversion lacks type at end of format [-Wformat=] scanf("%l", &n); ^ polynom.c:6:8: warning: too many arguments for format [-Wformat-extra-args] polynom.c:8:8: warning: conversion lacks type at end of format [-Wformat=] scanf("%l", &x); ^ polynom.c:8:8: warning: too many arguments for format [-Wformat-extra-args] polynom.c:9:29: warning: conversion lacks type at end of format [-Wformat=] for (i=n; i>=0; i++) scanf("%l", &a[i]); ^ polynom.c:9:29: warning: too many arguments for format [-Wformat-extra-args] polynom.c:13:9: warning: conversion lacks type at end of format [-Wformat=] printf("%l", p1); ^ polynom.c:13:9: warning: too many arguments for format [-Wformat-extra-args] polynom.c:10:11: warning: unused variable 'p2' [-Wunused-variable] long p1, p2; ^ polynom.c:3:14: warning: unused parameter 'argc' [-Wunused-parameter] int main(int argc, char ** argv) ^ polynom.c:3:28: warning: unused parameter 'argv' [-Wunused-parameter] int main(int argc, char ** argv) ^ Что делать? Я так понял, накосячил с prinf и scanf, но в чем именно? Вроде же все переменные формата long, и в printf и scanf поставил %l.

  1. Всем доброго времени суток, решил взяться за СИ, и начал с простейших задач. Пишу в GVim, компилирую через терминал. Задача стоит таким образом: Составить программу вывода на экран следующей информации: 100 t 1949 v t, v — переменные величины целого типа, значения которых вводятся с клавиатуры и должны быть выведены вместо имен величин. Собственно когда я просто ввожу любое число мне выводит его, 1949 и 2 адреса в памяти (хотя я могу ошибаться). Вот кодC1 2 3 4 5 6 7 8 9 #include   int main () {   int a = 100,b = 1949,t,v;     scanf ("%d,%d,%d,%d", &a,&b,&t,&v);     printf("%d,%d\n,%d,%d\n", a,b,t,v); return 0; }И еще вопрос, как выводить без запятой перед -1175555504 (или перед любым другим числом)

  1. Всем добрый день. Как разобрать данные с плавающей запятой из датчика ds18b20, и правильно разбить по разрядам 7ми сегментного индикатора. Код считывания температурыC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 for(j=0;j> 4);               // целая часть числа     drob_tmp = temps & 0x0F;          // дробная часть числа с точностью 1/16 градуса              drob  = (unsigned int) ((drob_tmp * 10) / 16); // преобразование дробной части в формате "1/16 градуса" в десятичный формат с точностью 0,1 градуса   if (temperature<0) {//Если темп. плюсовая или 0 buf5=10;// знак "-" 6разряду } buf0=0;//5разряд buf1=drob;//4разряд buf2=celie/100;//3разряд buf3=celie%100/10;//2разряд buf4=celie%10;//1разряд j++;           } delay_ms(800); }

  1. Здравствуйте. Помогите разобраться с динамическим выделением памяти в массиве строк. Нашел в сети код очереди. Правда, там был тип хранящихся значений int. Я же переделал так, чтобы хранились не целые числа, а строки. Вот код:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 #include #include #include   struct queue {       char** v;     int head;     int tail;     int size;     int maxsize; };   /* queue create: Creates an empty queue. */ struct queue *queue_create(int maxsize) {       struct queue *q = malloc(sizeof (*q));     if (q != NULL) {             q->v = (char**) malloc(sizeof(char*) * (maxsize+1));         if (q->v == NULL) {                     free(q);             return NULL;         }         q->maxsize = maxsize;         q->size = 0;         q->head = maxsize + 1;         q->tail = 0;     }     return q; }   /* queue_free: Removes queue. */ void queue_free(struct queue *q) {       free(q->v);     free(q); }   /* queue_size: Returns size of a queue. */ int queue_size(struct queue *q) {     return q->size; }   /* queue_enqueue: Add item to the queue. */ int queue_enqueue(struct queue *q, char* value) {         if (q->head == q->tail + 1) {             fprintf(stderr, "queue: queue overflow\n");         return -1;     }     q->v[q->tail++] = (char*) malloc(strlen(value)+1);     strcpy(q->v[q->tail++],value);     q->tail = q->tail % (q->maxsize + 1);     q->size++;     return 0; }   /* queue_dequeue: Gets item from the queue. */ char* queue_dequeue(struct queue *q) {     char *val;     if (q->head % (q->maxsize + 1) == q->tail) {         /* queue is empty */         fprintf(stderr, "queue: Queue is empty\n");         return NULL;     }     q->head = q->head % (q->maxsize + 1);     q->size--;     strcpy(val,q->v[q->head++]);     free(q->v[q->head++]);     return val; }   int main() {     struct queue *q;     int i;     char* val;       q = queue_create(10);         val = "stroka\n";     for (i=0; i<10; i++) {         queue_enqueue(q, val);     }         fprintf(stdout, "Очередь: \n");     for (i=0; i<10; i++) {             val = queue_dequeue(q);         fprintf(stdout, "%s\n", val);     }         queue_free(q);     return 0; }В итоге, программа валится в функции queue_enqueue на строке strcpy(q->v[q->tail++],value); Ошибка сегментирования. Явно я что-то намудрил с выделением памяти, но на вид вроде все правильно. Может, у вас глаз наметан лучше...