Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 3

Как правильно вычислить длину строки?

23.12.2018, 21:58. Показов 1842. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
народ, не судите строго только начал изучать С++. Вопрос собственно таков - ввожу с клавиатуры строку символов с помощью getchar(ch) и хочу узнать длину строки, но используя strlen(ch), получается странная длинна..... поясните плиз, в чем беда???

C++ (Qt)
1
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
#include "pch.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
 
int main()
{
    setlocale(LC_ALL, "rus");
    int i;
    char ch[25];
    printf("Введите максимально 25 символов и нажмите Enter\n");
    
    for (i = 0; i < strlen(ch); i++)
    {
        ch[i] = getchar();
        if (ch[i] == '\n')
        {
            i--;
            break;
        }
    }
    putchar('\n');
    printf(" %d\n", strlen(ch));
    putchar('\n');
    for (i=0; i <= strlen(ch); i++)
    {
        putchar(ch[i]);
        if (ch[i] == '\n')
        {
            break;
        }
    }
    putchar('\n');
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.12.2018, 21:58
Ответы с готовыми решениями:

Вычислить длину введенной строки и вывести символы строки с четными индексами
Напишите программу, которая требует ввода строки с клавиатуры. Программа вычисляет длину строки и выводит на экран только те символы...

Как правильно определить длину строки в кодировке UTF-8?
подскажите как в этот код добавить utf-8 ? потому что русские символы тяжелее в 2 раза. if(strlen($_POST) &gt;= 4 &amp;&amp;...

Вычислить длину строки
Разработать про-грамму, которая вычисляет длину введенной с клавиатуры строки. Есть 2 текстбоксa и 1 кнопка.

9
 Аватар для alkl
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
23.12.2018, 22:20
Цитата Сообщение от MegaJhon Посмотреть сообщение
странная длинна
Это как ? Можете пояснить ?

Добавлено через 5 минут
Подозреваю, ошибка тут :
Цитата Сообщение от MegaJhon Посмотреть сообщение
for (i = 0; i < strlen(ch); i++)
Замените strlen(ch) на 25.
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 3
23.12.2018, 22:26  [ТС]
и в моем варианте и том что говорите вы выводит на экран длинну равную 37, откуда она берется...
0
 Аватар для alkl
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
23.12.2018, 22:28
Не верю.
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
23.12.2018, 22:40
Лучший ответ Сообщение было отмечено MegaJhon как решение

Решение

Цитата Сообщение от MegaJhon Посмотреть сообщение
в чем беда???
В том, что при изучении C++ нужно читать и обязательно думать, писать программы и при этом тоже думать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    char ch[25]; // Это массив символов. Кто сказал, что это строка?
    // А еще на данный момент он содержит мусор (любые непредсказуемые значения).
 
    printf("Введите максимально 25 символов и нажмите Enter\n");
    
    // Цикл по i от 0 до ЧЕГО?! В ch же мусор, какую длину strlen() должна вернуть?!
    for (i = 0; i < strlen(ch); i++)
    {
        ch[i] = getchar();
        if (ch[i] == '\n')
        {
            i--; // Зачем это?
            break;
        }
    }
Задумывались ли вы о том, откуда strlen() узнает длину строки, при том что мы ей подсовываем массив символов? Чтобы массив символов стал строкой (C-String если быть точнее), то в конце последовательности символов должен стоять терминальный символ '\0'. Увидев этот ноль, все работающие с такими строками функции знают, что строка закончилась.

Давайте исправлять ваш код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <cstdio>
#include <cstring>
 
int main() {
    char ch[26]; // Для строки из 25 символов потребуется 26 элементов массива.
    printf("Введите максимально 25 символов и нажмите Enter\n");
 
    int pos = 0;
    char c = getchar();
 
    // Контролируем длину введенной строки - не более 25 символов.
    // И символ перевода строки тоже должен прекратить ввод.
    while ((pos < 25) && (c != '\n')) {
        ch[pos++] = c;
        c = getchar();
    }
 
    // В конце введенной последовательности обязательно ноль.
    ch[pos] = '\0';
 
    // Теперь strlen() работает правильно.
    printf("strlen: %d\n", strlen(ch));
    return 0;
}
Вообще, вы уверены, что изучаете C++? Уж очень на него мало похоже, особенно на современный вариант...
2
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
23.12.2018, 22:51
MegaJhon, valen10, может так будет проще? char str[26] = { 0 };
Заполняет при инициализации всю строку нулями

Добавлено через 3 минуты
Вместо постоянного вызова strlen в for, мы можем написать так:
for (i = 0; ch[i]; i++)
Здесь он сам будет смотреть не ноль ли в значении
1
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
23.12.2018, 22:54
Цитата Сообщение от Avaddon74 Посмотреть сообщение
может так будет проще? char str[26] = { 0 };
Проще Хотел более наглядно показать, тем более что с таким инициализатором массива могут возникнуть новые вопросы. Сам к нему не могу еще привыкнуть.
1
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 3
24.12.2018, 00:17  [ТС]
я все понял, всем спасибо, изучаю я по книге 2015 года, код что я привел - из книги, но там немного не так как я написал, вообщем я загнался... объясните пожалуйста еще про этот способ
Цитата Сообщение от Avaddon74 Посмотреть сообщение
char str[26] = { 0 };
для чего нулями заполнять массив?
0
 Аватар для alkl
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
24.12.2018, 00:28
Чтобы потом не делать этого :
C++
1
2
    // В конце введенной последовательности обязательно ноль.
    ch[pos] = '\0';
Ведь весь массив итак нулями заполнен.
Но, это всё учитывая, что массив маленький. С огромными массивами лучше так не делать, без особой надобности.

Добавлено через 1 минуту
Прав был valen10 :
Цитата Сообщение от valen10 Посмотреть сообщение
тем более что с таким инициализатором массива могут возникнуть новые вопросы
1
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
24.12.2018, 00:30
Цитата Сообщение от MegaJhon Посмотреть сообщение
для чего нулями заполнять массив?
Допустим у вас массив на 10 символов и в нем хранится всякий мусор из оперативки, который был в той области памяти, где выделилось место под массив.
Если не заполнить его нулями, то при записи нескольких символов, только они и перезапишутся, а в конце мусор останется. Функции по определению длины массива, ищут в конце массива 0 и по нему определяют длину
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.12.2018, 00:30
Помогаю со студенческими работами здесь

Найти максимальную длину строки в текстовом файле и распечатать все строки файла, имеющие такую длину
Найти максимальную длину строки в текстовом файле и распечатать все строки файла, имеющие такую длину. Помогите народ!!! С#

Найти максимальную длину строки в текстовом файле и распечатать все строки файла, имеющие такую длину
Найти максимальную длину строки в текстовом файле и распечатать все строки файла, имеющие такую длину.С++

Найти в файле максимальную длину строки и вывести в новый файл все строки, имеющую такую длину
Товарищи, простите что обращаюсь. Кому не сложно, помогите (решите) хоть сколько нибудь из этих 3 заданий. Сам я чайник, много проболел и...

Вычислить длину символьной строки
В ТЕМЕ ДОЛЖНА БЫТЬ ТОЛЬКО ОДНА ЗАДАЧА! Задание 1. 1. Написать три функции, которые получают строку, подсчитывают и возвращают ее...

Вычислить длину большей строки
Даны строки А и В. Вычислить длину большей строки. Допустимые процедуры и функции: - Процедуры: Delete, Insert, Str, Val -...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru