Ответы пользователя по тегу C
  • Какая ВУЗовская база необходима, для того, чтобы по праву считать себя техническим специалистом и развиваться в этом направлении дальше?

    dio4
    @dio4
    team leader, system engineer, master of sports
    Все бросаются то туда, то сюда. Решите сами, что хотите, но с оглядкой на это, как мне кажется ссылка
    Ответ написан
    Комментировать
  • Как конвертировать строку с шестнадцатиричным числом в десятичную систему?

    dio4
    @dio4
    team leader, system engineer, master of sports
    тут расписано
    Для вас код на чистом "си"
    #include <stdio.h>
    #include <stdlib.h>
    int main ()
    {
       char numbers[] = "0x6fffff"; // ваша исходная строка
       long int li4 = strtol(numbers, NULL, 0); // получите ваш эквивалент
       printf("Десятичный эквивалент распознанного числа:%ld\n", li4); 
       char buff[100];
       sprintf( buff, "%ld", li4 ); // если нужно эквивалент снова сделать строкой
       printf("Ваша строка из числа: %s\n", buff);
       return EXIT_SUCCESS;
    }
    /* консоль
    Linux ubuntu14 3.13.0-153-generic #203-Ubuntu SMP Thu Jun 14 08:52:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    alexander@ubuntu14:~/tmp$ gcc trans.c -o trans_c
    alexander@ubuntu14:~/tmp$ ./trans_c
    Десятичный эквивалент распознанного числа:7340031
    Ваша строка из числа: 7340031
    */
    Ответ написан
    9 комментариев
  • Найти самое часто встречающееся слово в тексте. Ввод слов в динамический массив. Как сделать без map?

    dio4
    @dio4
    team leader, system engineer, master of sports
    Обратите внимание на функцию char * strstr( const char * string1, const char * string2 );
    тут
    Никаких сложностей не нужно. Стандартная функция си - описана в string.h
    Искомыми подстроками будут слова из 1-й строки и тд.
    Ответ написан
    Комментировать
  • Как реализовать считывание строк из файла в массив строк?

    dio4
    @dio4
    team leader, system engineer, master of sports
    /* читаем из файла требуемое кол. строк ROWS или до конца файла EOF
     * (что наступит раньше), формируем строку по конечному символу '\n'
     * в файле, затем добавляем завершающий '\0' и полученную строку СИ 
     * записываем
     * в двумерный массив по 1-й строке в каждый элемент массива.
     * Затем массив выводим на консоль. Есть подсчет считанных строк.
     * См также ниже мой коммент
    */
    
    /* file_in находится в каталоге программы и имеет вид:
    I am a human 1
    I am a 2 human`s 2
    I am a 3 human 3
    Nmjh## ___ 987 ht!
    5555555555555555
    66666666666666
    77777777777777
    8888888888888888
    */
    
    #include <stdio.h>
    #include <stdlib.h> /* prototype exit() */
    #include <string.h>
    #define ROWS 7
    #define COLS 20
    void file_open(void);
    FILE * file_in;
    char ch, arr_str[ROWS][COLS];
    int j, i, count = 0;
    
    int main(int agrc, char * argv[]){
      file_open();
      for(j = 0; j < ROWS; ++j){
        for(i = 0; (ch=getc(file_in)) != '\n' && (ch != EOF); ++i) {
          arr_str[j][i] = ch; // заполнение строки
        } //конец внутреннего for
        if(ch == EOF){
          puts("достигнут конец файла, выход.");
          fprintf(stdout, "count is: %i \n", count);
          break;
        } // конец if
        else{
          arr_str[j][i] = '\0'; 
          ++count;
        } // конец else
        
      } // конец внешнего for
      fclose(file_in);
    /* вывод массива на консоль */
      fprintf(stdout, "Из файла считано %i строк, которые имеют вид:\n", count);
      puts(""); // пропуск строки
      for(j = 0; j < count; ++j){
        fprintf(stdout, "%s\n", arr_str[j]);
      }
      puts(""); // пропуск строки
      puts("Программа завершена.");
      exit(EXIT_SUCCESS);
    }
    
    void file_open(void){
      if( (file_in = fopen("file_in", "r")) == NULL){
        fprintf(stdout, "%s\n", "не могу отрыть файл для чтения");
        exit(EXIT_FAILURE);
      }
    }
    
    /*
    Вывод на консоль:
    Из файла считано 7 строк, которые имеют вид:
    
    I am a human 1
    I am a 2 human`s 2
    I am a 3 human 3
    Nmjh## ___ 987 ht!
    5555555555555555
    66666666666666
    77777777777777
    
    Программа завершена.
    */
    Ответ написан
  • Какую практическую задачу выбрать для изучения C/C++?

    dio4
    @dio4
    team leader, system engineer, master of sports
    напишите на "с" каталогизатор - программу учета (чего угодно - ваших книг, например) с участием СУБД (скажем mysql) и конечно, под Linux, тк он родной для "с" - это будет классно. Потом прикрутите туда не консольное меню, а графическое (к примеру сначала ncurses, потом gtk, потом qt). И интересно и применить сможете всегда где-то и научитесь многому. Ну, может потом все это перепишите на с++ и проверите скорость работы, время компиляции и тд - там и там. Сделаете выводы для себя.
    Ответ написан
    Комментировать
  • Поиск одинаковых символов в строке и их замена. Какие функции лучше использовать?

    dio4
    @dio4
    team leader, system engineer, master of sports
    Код корявый (делал на коленке и бегом), но почти все, как задано в условии. Только один массив для строки и есть проверки на старте программы (на единичность символа, на его отсутствие и тд - смотрите). Меняет и повторяющиеся участки тоже (без ограничений - только на размер buff). Код вроде работает как надо. Пользуйтесь.
    /* ваши комменты */
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define SIZE 50
    char buff[SIZE] = {0};
    
    int main(int argc, char * argv[]){
    	int i, j, num1, num2;
    	char c = '.'; // искомый символ
    	char * str_ptr1;
    	char * str_ptr2;
    	puts("введите произвольную строку");
    	gets(buff);
    	str_ptr1 = strchr(buff, c);
    	str_ptr2 = strrchr(buff, c);
    	
    	if (str_ptr1 == 0){ 
    		puts("искомого символа нет в строке");
    		exit(EXIT_FAILURE);
    	}
    	else if (str_ptr2 == 0 || str_ptr2 == str_ptr1){
    		fprintf(stdout, "%s", "Искомый символ единичен в строке");
    		exit(EXIT_FAILURE);
    	}
    	size_t len = strlen(buff);
    	i = 0;
    	while(buff[i] != '\0'){
    		if(buff[i] == c && buff[i+1] == c){
    			num1 = i + 1;
    			while(buff[i+1] == c){
    				++i;
    				num2 = i;
    			}
    			
    			for(j = 0; j <= (len - num2 + 1); ++j){
    			buff[num1 + j] = buff[num2 + 1 + j];
    			}
    		}
    		++i;
    	}
    	puts("Итоговая строка имеет вид: ");
    	puts(buff);
    	exit(EXIT_SUCCESS);
    }
    /* в консоли:
    введите произвольную строку
    ...abc...de
    Итоговая строка имеет вид: 
    .abc.de
    
    введите произвольную строку
       ngt,,,
    искомого символа нет в строке
    
    */
    Ответ написан
    Комментировать
  • Книга по программированию в Linux?

    dio4
    @dio4
    team leader, system engineer, master of sports
    Комментировать
  • Почему в командной строке выводится неправильный результат?

    dio4
    @dio4
    team leader, system engineer, master of sports
    Ошибка в строке
    printf("%с%с need %d pencils and %d notebooks and 1 luchbox \n",firstInitial, middleInitial,number_of_pencils, number_of_notebooks);
    в том, что вы ее скопировали видимо из pdf файла (или какие то символы служебные нечаянно набрали в русской раскладке) и там присутствуют символы, которых там быть не должны. ПЕРЕПИШЕТЕ ее руками внимательно в англ. раскладке и все будет хорошо :)
    У меня все прошло и вот вывод (скриншот прилагаю):
    $ ./tmp
    JR need 7 pencils and 5 notebooks and 1 lunchbox
    Total cost is 18.25
    MJ needs 10 pencils and 3 notebooks and 1 lunchbox
    The total cost is $14.28

    0cbb395b69db4011ab0c8566a73eadf0.png
    Ответ написан
  • Как сравнить массивы в С?

    dio4
    @dio4
    team leader, system engineer, master of sports
    #include <stdio.h>
    /*прототип функции вычисления суммы массива*/
    int summarr(int *, int);
    
    int arr1[] = {1,2,3,4,5,13,27};
    int arr2[] = {6,7,8,9,10, 101};
    
    
    int main(int argc, char * argv[]){
    	
    	int summ_arr1 = 0, summ_arr2 = 0, i;
    	/*вызываем функцию вычисления суммы массива*/
    	summ_arr1 = summarr(arr1, sizeof arr1/sizeof(int));
    	summ_arr2 = summarr(arr2, sizeof arr2/sizeof(int));
    	
    	/*сравниваем суммы и выводим значение большей из них*/
    	fprintf(stdout, "%i ", (summ_arr1 > summ_arr2 ? summ_arr1 : summ_arr2));
    	if(summ_arr1 > summ_arr2)
    		fprintf(stdout, "большее значение summ_arr1\n");
    	else if(summ_arr1 < summ_arr2)
    		fprintf(stdout, "большее значение summ_arr2\n");
    	else
    		fprintf(stdout, "массивы равны");
    	return 0;
    }
    
    int summarr(int *arr , int size){
    	int i, summ_arr = 0;
    	for (i = 0; i < size; i++){
    		summ_arr += *(arr + i);
    	}
    	return summ_arr;
    }
    
    /*
    Linux alexander-Inspiron-3521 3.13.0-74-generic #118-Ubuntu SMP Thu Dec 17 22:52:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    вывод в консоли:
    $ make sizeof
    cc     sizeof.c   -o sizeof
    alexander@alexander-Inspiron-3521:~$ ./sizeof
    141 большее значение summ_arr2
    */
    Ответ написан
  • В чем различие void func(char * var) от void func(char **var)?

    dio4
    @dio4
    team leader, system engineer, master of sports
    Меньше слов - больше кода )))
    #include <stdio.h>
    char * arr_char = "I am a 1";
    typedef  char * type_p;
    /* создаем указатель на указатель */
    type_p * parr_char = &arr_char;
    
    int main( int argc, char * argv[]){ 
    // вывод строки через двойную **  
    	while( **parr_char != '\0' ) {
    		printf("%c", **parr_char);
    		(*parr_char)++;
    	}
    	printf("\n"); 
    // вывод строки через одинарную *  
    	arr_char = &"I am a 1"[0];  // возвращаем указатель на начало строки
    	//arr_char = "I am a 1";  // или так возвращаем указатель на начало строки
     //arr_char = arr_char - 8;  // или так на начальный размер strlen(arr_char)
    	while( *arr_char != '\0' ) {
    		printf("%c", *arr_char);
    		arr_char++;
    	}
    	printf("\n"); 
    	return 0;
    }
    /*
    Linux alexander-Inspiron-3521 3.13.0-74-generic #118-Ubuntu SMP Thu Dec 17 22:52:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    имеем в консоли
    ./tmp_str
    I am a 1
    I am a 1
    
    */
    Ответ написан
    1 комментарий
  • Как сделать прямое соединение (NAT'ы)?

    dio4
    @dio4
    team leader, system engineer, master of sports
    Делать так. На том сервере КУДА надо, выделяете отдельный порт (например 7777) и на него шлете свои пакеты. А там на серваке просите админа, чтобы он перенаправлял входящие на этот порт на ШТАТНЫЕ порты машинок из ЛВС(например на 80). Вот и все. Те вы шлете (предположим) свои TCP на порт 7777, а сервак их пробрасывает на локальные тачки на 80-й штатный порт. И если там у кого -то httpd пашет, то он вам ответит и вы получите его отклик.
    Просто как пример для RDP и Radmin на FreeBSD
    тут
    И я прошу прощения, может прежде чем программирование сетей пытаться поднять(IMHO это не просто), сначала просто с сетями разберетесь? Хотя дело не мое.
    Ответ написан
    Комментировать
  • Есть книжка для изучения Си с примерами на Микро Контроллерах?

    dio4
    @dio4
    team leader, system engineer, master of sports
    Я не спец по МК, но, мне кажется, что эта книжка будет вам интересна, наверное.
    Дэвид Гриффитс, Дон Гриффитс - Изучаем программирование на C 2013г.
    смотреть тут
    Прочитав ее, вы узнаете не только о мкконтроллерах, но и язык подтяните и сам процесс чтения должен доставить удовольствие.
    Вот один из отзывов:"В книге много иллюстраций и примеров доходчиво объясняющих основы языка Си. Отличная подача материала с пояснениями на примерах. Моя вторая книга по Си, изучаю в связке с микроконтроллерами. Рекомендую всем кто самостоятельно изучает Си."
    Ответ написан
    Комментировать
  • Плохо ли смотреть готовый код задач по СИ, чтобы понять как это работает?

    dio4
    @dio4
    team leader, system engineer, master of sports
    /* вывод символа # в строках и столбцах - читайте и разбирайтесь на здоровье. Если нужен интерактивный ввод - сами допишите. Это на гистограмму не влияет :-)  */
    
    #include <stdio.h>
    int main(void)
    {
    	int total = 9;
    	for(int i = 2; i <= total; ++i) {
    		for(int j = 1; j <= i; ++j) {
    			printf("#");
    		}
    		printf("\n");
    	}
    	return 0;
    }
    /* ВЫВОД 
    alexander@alexander-Inspiron-3521:~/my$ gcc -std=c99 output.c -o 4_16 && ./output
    ##
    ###
    ####
    #####
    ######
    #######
    ########
    #########
    */
    Ответ написан
  • Из support в developer?

    dio4
    @dio4
    team leader, system engineer, master of sports
    "...написать свой большой проект (программу) для автоматизации (умный дом)" - это быстрее будет, наверное, на python + raspberry. На с тоже можно конечно, но дольше, хотя работать будет в разы быстрее. Делайте то, что вам сердце подсказывает, - это даст вдохновение, а со временем и деньги ( я надеюсь). Удачи.
    Ответ написан
    Комментировать
  • Почему возникает проблема с указателем в C?

    dio4
    @dio4
    team leader, system engineer, master of sports
    #include <stdio.h>
    #include <string.h>
    
    void ptrTest(const char * ); //здесь имя не нужно
    
    int main(int argc, const char * argv[]) {
        const char * superString = "qwe rty uio"; // тк  "qwe rty uio" это строковый литерал (константа), то используйте const char * 
        
        ptrTest(superString);
        
        return 0;
    }
    
    void ptrTest(const char * testString) {
        printf("%s\n", testString); //выведет строку. 
        printf("\n");
        printf("%p\n", testString); //выведет адрес 1-го элемента строки (имя массива - есть адрес его 1-го элемента)
    }
    
    /*
    У меня(но суть такая же будет и в windows):
    Linux alexander-Inspiron-3521 3.13.0-74-generic #118-Ubuntu SMP Thu Dec 17 22:52:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    
    Вывод в консоли
    $ gcc toster_ru.c -o toster_ru && ./toster_ru
    qwe rty uio
    
    0x4006b4
    */
    Ответ написан
    Комментировать
  • Не совсем понимаю суть ошибки,кто поможет?

    dio4
    @dio4
    team leader, system engineer, master of sports
    переустановите свою IDE и если устанавливали плагин, дающий сбой отдельно, то позже переустановите и его. Вы где работаете? В Linux, Windows ?
    Ответ написан
  • Какой хороший курс или ресурс по СИ для подготовки к собеседованию?

    dio4
    @dio4
    team leader, system engineer, master of sports
    Бери - есть все! Даже можно скачать весь сайт с примерами, задачами и тд.
    ermak.cs.nstu.ru/cprog/html
    Ответ написан
    2 комментария