На этом шаге мы рассмотрим пример программы, использующей перечисленные на предыдущем шаге функции.
Напишем программу, на примере которой проследим, как работают рассмотренные на предыдущем шаге функции.
// StrFunc.cpp: главный файл проекта. #include "stdafx.h" #include <clocale> //обязательно для функции setlocale() #include <string.h> //for strcpy() #include <stdio.h> //for getchar(),putchar(),printf() #include <conio.h> //for _getch() #include <stdlib.h> //for atoi(),atof() #define MAXLINE 1000 #define eof -1 using namespace System; // функция getline(s,lim) вводит с клавиатуры строку в s и возвращает // длину введенной строки с учетом символа '\0'; // lim - максимальное количество символов, которое можно ввести в строку s int getline (char s[], int lim) { int c, i; for(i=0; i<lim-1 && (c=getchar()) != eof && c != '\n'; i++) s[i] = c; s[i]='\0'; i++; //для учета количества return i; } // ---------------------------------- int main() { setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами //для корректного вывода кириллицы //Программы работы со строками в С //--- использование sprintf() char s1[MAXLINE]; char c, c1, ot[5], v1[MAXLINE]; do { printf("Задайте строку для sprintf(). >"); getline(s1, MAXLINE); printf("Задайте целое число n для sprintf()...>"); getline(ot,5); int x=atoi(ot); printf("Задайте вещественное число m для sprintf()...>"); getline(ot,5); float y=atof(ot); sprintf(v1, "%d %f %s", x, y, s1); printf ("v=%s\n", v1); printf("Продолжить - <Enter>, выход - <Ctrl+z> >"); } while((c1=getchar()) != eof); //--- использование strcpy() char s2[MAXLINE], v2[MAXLINE]; while((c=getchar()) != eof) { printf ("\n\nЗадайте строку для strcpy() >\n"); getline(s2, MAXLINE); strcpy(v2,s2); printf("Скопированная строка=%s\n",v2); printf("Продолжить - <Enter>, выход - <Ctrl+z> >"); } _getch(); //--- использование strcmp(), strlen() char s3[MAXLINE], v3[MAXLINE]; while((c=getchar()) != eof) { printf("\n\nЗадайте строку для strcmp() >"); getline(s3, MAXLINE); printf("Задайте еще строку для strcmp() >"); getline(v3, MAXLINE); int i=strcmp(s3, v3); printf("Результат сравнения строки=%d\nстрока длиной=%d\n ", i,strlen(s3)); if(i==0) printf("string1 = string2\n"); if(i>0) printf("string1 > string2\n"); if(i<0) printf("string1 < string2\n"); printf("Продолжить - <Enter>, выход - <Ctrl+z> >"); } _getch(); //--- использование strcat() char s4[MAXLINE], v4[MAXLINE]; while((c=getchar()) != eof) { printf("\n\nЗадайте строку для strcat() >"); getline(s4, MAXLINE); printf("Задайте еще строку для strcat() >"); getline(v4, MAXLINE); printf("Результат работы функции strcat(): %s\n",strcat(s4,v4)); printf("Продолжить - <Enter>, выход - <Ctrl+z> >"); } _getch(); return 0; }
Для ввода данных мы использовали ранее рассмотренную нами функцию getline(), которая вводит строку символов. Но для наших целей нам требуется вводить числа. Поэтому мы их вводим с помощью getline() как текст, а потом преобразуем в формат int с помощью функции atoi(), которая преобразует строковые данные в целое число и возвращает это число. Если в строке не числовые данные, то функция возвратит ноль.
Другая функция, использованная нами при переводе строковых данных в формат float, - это функция atof(). Она возвращает число в формате float, преобразуя свою входную строку. Также возвращает ноль, если в строке не числовые данные. Для ввода чисел мы использовали массив char ot[5], поскольку число, вводимое в примере, не превзойдет пяти символов (ввести оолыие не позволит функция getline(): так мы ее сформировали).
В этой программе мы встретились с новой конструкцией цикла do...while. Она работает как while, но с тем отличием, что конструкция while проверяет условие продолжения/окончания цикла в своей заголовочной части, а конструкция do...while - в конце. Если нарушается условие продолжения выполнения цикла while, то его тело пропускается. Но в жизни бывают случаи, когда требуется, чтобы цикл while выполнился хотя бы один раз. Для этого и используют пару do...while, в которой условие продолжения проверяется в конце цикла, поэтому тело цикла будет выполнено хотя бы один раз. Формат этой констукции цикла таков:
do // тело цикла while (Условие цикла);
Точка с запятой обязательна. Для ввода нескольких вариантов данных в этой проверочной программе потребовалось ввести так называемое зацикливание: использовать конструкцию while, которая обеспечивает зацикливание за счет запроса ввода символа либо для продолжения ввода другого варианта данных либо для выхода из участка проверки. Но на первом участке удобно проводить проверку на продолжение ввода вариантов данных не в начале участка, а в конце, чтобы первый вариант данных вводился без проверки. Иначе пошел бы запрос на ввод символа для проверки на продолжение ввода: программа ожидала бы ввода, на экране мигал бы один курсор, и пользователю было бы непонятно, что же надо дальше делать.
Поясним немного, что сделала функция sprintf ().
Для ее проверки мы ввели два числа (одно целочисленное, другое - вещественное) и строку, чтобы показать, что sprintf() их обработает по форматам (в управляющей строке функции мы задали эти форматы) и соберет в единую строку, включив в нее и символы, которые находились между полями, задающими форматы (т. е. между полями, начинающимися со знака % и оканчивающимися одним из символов форматирования d, f, s,...).
Для функции strcmp() мы вывели значение, которое она возвращает, чтобы можно было удостовериться, что это есть разность между первыми несравнившимися кодами символов. Попробуйте определить, какие символы первыми не сравнились, найдите их коды: это можно сделать, воспользовавшись стандартной функцией char (имя символа), которая возвращает код символа, указанного у нее в аргументе (например, int a=char ('а')).
Результат работы проверочной программы приведен на рисунке 1.
Рис.1. Результат работы приложения
На следующем шаге мы вернемся к типам переменных.