Строки и их манипуляция в языке C

CCBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии вы научитесь создавать и манипулировать строками в программировании на языке C. Вы изучите различные методы определения строк, форматирования их с помощью printf, определения их длины с помощью strlen и сравнения с помощью strncmp. Эти основные операции со строками являются важными для создания надежных и гибких приложений на языке C.

В лабораторном занятии рассматриваются следующие шаги: определение строк с использованием указательной нотации, определение строк с использованием локальной массивной нотации, форматирование строк с помощью printf, определение длины строки с помощью strlen и сравнение строк с помощью strncmp. По завершении этого лабораторного занятия вы получите твердую базу знаний по работе со строками на языке C и сможете применять эти техники в своих собственных проектах.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/PointersandMemoryGroup(["Pointers and Memory"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c/BasicsGroup -.-> c/operators("Operators") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/CompoundTypesGroup -.-> c/strings("Strings") c/PointersandMemoryGroup -.-> c/pointers("Pointers") c/PointersandMemoryGroup -.-> c/memory_address("Memory Address") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/operators -.-> lab-438258{{"Строки и их манипуляция в языке C"}} c/arrays -.-> lab-438258{{"Строки и их манипуляция в языке C"}} c/strings -.-> lab-438258{{"Строки и их манипуляция в языке C"}} c/pointers -.-> lab-438258{{"Строки и их манипуляция в языке C"}} c/memory_address -.-> lab-438258{{"Строки и их манипуляция в языке C"}} c/output -.-> lab-438258{{"Строки и их манипуляция в языке C"}} end

Определение строк с использованием указательной нотации

В этом шаге вы научитесь определять строки с использованием указательной нотации в языке C. Указательная нотация предоставляет гибкий способ создания и манипуляции строками в программировании на языке C.

Сначала создадим новый файл, чтобы продемонстрировать определение строки с использованием указательной нотации:

cd ~/project
touch string_pointer.c

Теперь введите следующий код:

#include <stdio.h>

int main() {
    // Define a string using pointer notation
    char *greeting = "Hello, C Programming!";

    // Print the string
    printf("Greeting: %s\n", greeting);

    return 0;
}

Скомпилируйте и запустите программу:

gcc string_pointer.c -o string_pointer
./string_pointer

Пример вывода:

Greeting: Hello, C Programming!

Разберем код на части:

  • char *greeting объявляет указатель на символ (строку)
  • "Hello, C Programming!" - это строковый литерал, хранящийся в памяти
  • Указатель greeting указывает на первый символ строки
  • printf() использует спецификатор формата %s для вывода всей строки

Вы также можете изменить указатель так, чтобы он указывал на разные части строки:

#include <stdio.h>

int main() {
    char *greeting = "Hello, C Programming!";

    // Point to a specific part of the string
    char *partial = greeting + 7;

    printf("Original string: %s\n", greeting);
    printf("Partial string: %s\n", partial);

    return 0;
}

Пример вывода:

Original string: Hello, C Programming!
Partial string: C Programming!

Определение строк с использованием локальной массивной нотации

В этом шаге вы научитесь определять строки с использованием локальной массивной нотации в языке C. Этот метод представляет собой альтернативный способ создания и инициализации строк с более прямым контролем над символьным массивом.

Создадим новый файл, чтобы продемонстрировать определение строки с использованием локальной массивной нотации:

cd ~/project
touch string_array.c

Введите следующий код:

#include <stdio.h>

int main() {
    // Define a string using local array notation
    char greeting[30] = "Hello, C Programming!";

    // Print the string
    printf("Greeting: %s\n", greeting);

    return 0;
}

Скомпилируйте и запустите программу:

gcc string_array.c -o string_array
./string_array

Пример вывода:

Greeting: Hello, C Programming!

Рассмотрим некоторые варианты использования локальной массивной нотации:

#include <stdio.h>

int main() {
    // Define an array with explicit initialization
    char name[10] = {'J', 'o', 'h', 'n', '\0'};

    // Define an array with partial initialization
    char city[20] = "New York";

    // Define an array without specifying size
    char message[] = "Welcome to C Programming!";

    printf("Name: %s\n", name);
    printf("City: %s\n", city);
    printf("Message: %s\n", message);

    return 0;
}

Пример вывода:

Name: John
City: New York
Message: Welcome to C Programming!

Основные моменты о локальной массивной нотации:

  • Вы можете явно указать размер массива
  • Символ '\0' (нулевой терминатор) важен для обозначения конца строки
  • Массивы могут быть инициализированы отдельными символами или строковыми литералами
  • Если массив не полностью инициализирован, оставшиеся элементы устанавливаются в ноль

Форматирование строк с помощью printf

В этом шаге вы научитесь использовать функцию printf() для форматирования строк и различных типов данных в языке C. Функция printf() предоставляет мощные возможности по форматированию строк.

Создадим новый файл, чтобы продемонстрировать форматирование строк:

cd ~/project
touch string_formatting.c

Введите следующий код, чтобы изучить различные варианты форматирования:

#include <stdio.h>

int main() {
    // Basic string formatting
    char name[] = "Alice";
    int age = 30;
    float height = 5.8;

    // Simple string output
    printf("Name: %s\n", name);

    // Formatting with multiple variables
    printf("Profile: %s is %d years old\n", name, age);

    // Formatting with floating-point precision
    printf("Height: %.1f meters\n", height);

    // Width and alignment
    printf("Name (right-aligned): %10s\n", name);
    printf("Name (left-aligned):  %-10s\n", name);

    // Mixing different format specifiers
    printf("Details: %s, %d years, %.1f meters\n", name, age, height);

    return 0;
}

Скомпилируйте и запустите программу:

gcc string_formatting.c -o string_formatting
./string_formatting

Пример вывода:

Name: Alice
Profile: Alice is 30 years old
Height: 5.8 meters
Name (right-aligned):      Alice
Name (left-aligned): Alice
Details: Alice, 30 years, 5.8 meters

Общие спецификаторы формата:

  • %s: Строки
  • %d: Целые числа
  • %f: Числа с плавающей точкой
  • %.1f: Числа с плавающей точкой с 1 знаком после запятой
  • %10s: Выравнивание вправо с шириной в 10 символов
  • %-10s: Выравнивание влево с шириной в 10 символов

Рассмотрим более продвинутые варианты форматирования:

#include <stdio.h>

int main() {
    // Hexadecimal and octal representations
    int number = 255;
    printf("Decimal: %d\n", number);
    printf("Hexadecimal: %x\n", number);
    printf("Octal: %o\n", number);

    // Padding with zeros
    printf("Padded number: %05d\n", 42);

    return 0;
}

Пример вывода:

Decimal: 255
Hexadecimal: ff
Octal: 377
Padded number: 00042

Определение длины строки с помощью strlen

В этом шаге вы научитесь использовать функцию strlen() для определения длины строк в языке C. Функция strlen() является частью библиотеки <string.h> и предоставляет простой способ подсчета количества символов в строке.

Создадим новый файл, чтобы продемонстрировать вычисление длины строки:

cd ~/project
touch string_length.c

Введите следующий код, чтобы изучить функцию strlen():

#include <stdio.h>
#include <string.h>

int main() {
    // Define strings of different lengths
    char greeting[] = "Hello, World!";
    char name[] = "Alice";
    char empty[] = "";

    // Calculate and print string lengths
    printf("Greeting: %s\n", greeting);
    printf("Greeting length: %lu characters\n", strlen(greeting));

    printf("Name: %s\n", name);
    printf("Name length: %lu characters\n", strlen(name));

    printf("Empty string length: %lu characters\n", strlen(empty));

    return 0;
}

Скомпилируйте и запустите программу:

gcc string_length.c -o string_length
./string_length

Пример вывода:

Greeting: Hello, World!
Greeting length: 13 characters
Name: Alice
Name length: 5 characters
Empty string length: 0 characters

Рассмотрим более практический пример использования функции strlen():

#include <stdio.h>
#include <string.h>

int main() {
    char input[100];

    printf("Enter a string: ");
    fgets(input, sizeof(input), stdin);

    // Remove newline character if present
    input[strcspn(input, "\n")] = 0;

    // Calculate and print string length
    size_t length = strlen(input);

    printf("You entered: %s\n", input);
    printf("String length: %lu characters\n", length);

    // Demonstrate length-based operations
    if (length > 10) {
        printf("This is a long string!\n");
    } else if (length > 0) {
        printf("This is a short string.\n");
    } else {
        printf("You entered an empty string.\n");
    }

    return 0;
}

Основные моменты о функции strlen():

  • Возвращает количество символов до нулевого терминатора
  • Не учитывает нулевой терминатор
  • Работает с символьными массивами и строковыми литералами
  • Входит в состав библиотеки <string.h>, поэтому необходимо подключить этот заголовочный файл
  • Возвращает тип size_t (беззнаковое целое число типа long)

Сравнение строк с помощью strncmp

В этом шаге вы научитесь использовать функцию strncmp() для сравнения строк в языке C. Функция strncmp() позволяет сравнивать заданное количество символов между двумя строками.

Создадим новый файл, чтобы продемонстрировать сравнение строк:

cd ~/project
touch string_compare.c

Введите следующий код, чтобы изучить функцию strncmp():

#include <stdio.h>
#include <string.h>

int main() {
    // Define strings for comparison
    char str1[] = "Hello, World!";
    char str2[] = "Hello, Everyone!";
    char str3[] = "Hello, World!";

    // Compare entire strings
    printf("Full string comparison:\n");
    int result1 = strncmp(str1, str2, strlen(str1));
    int result2 = strncmp(str1, str3, strlen(str1));

    printf("str1 vs str2: %d\n", result1);
    printf("str1 vs str3: %d\n", result2);

    // Compare first few characters
    printf("\nPartial string comparison:\n");
    int result3 = strncmp(str1, str2, 7);
    printf("First 7 characters of str1 vs str2: %d\n", result3);

    return 0;
}

Скомпилируйте и запустите программу:

gcc string_compare.c -o string_compare
./string_compare

Пример вывода:

Full string comparison:
str1 vs str2: -1
str1 vs str3: 0

Partial string comparison:
First 7 characters of str1 vs str2: 0

Создадим более практический пример сравнения строк:

#include <stdio.h>
#include <string.h>

int main() {
    // Password verification example
    char stored_password[] = "SecretPass123";
    char input_password[20];

    printf("Enter password: ");
    scanf("%19s", input_password);

    // Compare first 10 characters of the password
    int comparison = strncmp(stored_password, input_password, 10);

    if (comparison == 0) {
        printf("Access granted!\n");
    } else {
        printf("Access denied!\n");
    }

    return 0;
}

Основные моменты о функции strncmp():

  • Сравнивает до заданного количества символов
  • Возвращает 0, если строки совпадают на заданной длине
  • Возвращает отрицательное значение, если первая строка лексикографически меньше
  • Возвращает положительное значение, если первая строка лексикографически больше
  • Входит в состав библиотеки <string.h>
  • Полезна для частичного сравнения строк

Понимание возвращаемых значений функции strncmp():

  • 0: Строки равны на заданной длине
  • < 0: Первая строка идет перед второй строкой
  • 0: Первая строка идет после второй строки

Резюме

В этом практическом занятии вы научились определять строки как с использованием указательной нотации, так и локальной массивной нотации в программировании на языке C. С помощью указательной нотации вы можете гибко создавать и манипулировать строками, используя символьный указатель. С локальной массивной нотацией у вас есть более прямой контроль над символьным массивом. Вы также научились форматировать строки с помощью функции printf(), определять длину строки с помощью функции strlen() и сравнивать строки с помощью функции strncmp(). Эти техники манипуляции строками являются фундаментальными навыками для работы с текстовыми данными в языке C.