1 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 24
1

Индекс находится вне границ массива

19.10.2018, 18:16. Показов 3268. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть программы: считывание из файла и вывод на экран английского текста, заменяя первую букву слов, начинающихся с гласных, верхним регистром. Компилятор выдает исключение "Индекс находится вне границ массива" при сверке первой буквы(строка 27).
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
 
namespace Lab7
{
    class Program
    {
        static void Main(string[] args)
        {
            string file_path = "C:/Users/1/source/repos/Lab7/Lab7/test.txt";
            StreamReader Read = new StreamReader(file_path);;
            char[] vow = { 'a', 'e', 'y', 'u', 'i', 'o', 'A', 'E', 'Y', 'U', 'I', 'O',};
            string Entered = Read.ReadToEnd();
            Read.Close();
            string[] StringArray;
            StringArray = Entered.Split(new[] {' ',',','/','\\','.',':',';','!','?','"','-', });
            StringBuilder str;
            for(int i=0;i < StringArray.Length;i++)
            {
                str = new StringBuilder(StringArray[i]);
                for (int j = 0; j < vow.Length; j++)
                {
                    if (str[0]==vow[j])
                    {
                        str.Replace(str[0], char.ToUpper(str[0]), 0, 1);
                        Console.WriteLine(str);
                        break;
                    }
                }
            }
            Console.ReadKey();
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.10.2018, 18:16
Ответы с готовыми решениями:

Индекс находится вне границ массива
Не могу исправить ошибку &quot;Индекс находился вне границ массива&quot;. List&lt;string&gt; spec = new...

Индекс находится вне границ массива
Добрый день, не могу понять, в чем ошибка (выдает на строчку if (s == '1'), пишет, что массив...

Индекс находится вне границ массива
Выдает ошибку на { Console.WriteLine(&quot;Чётные: &quot; + &quot;a=&quot; +...

Индекс находится вне границ массива
using System.Text; namespace ConsoleApplication1 { class Program { static void...

5
Модератор
Эксперт .NET
15127 / 10416 / 2735
Регистрация: 21.04.2018
Сообщений: 30,852
Записей в блоге: 2
19.10.2018, 19:06 2
Лучший ответ Сообщение было отмечено SteelWing_RC как решение

Решение

Цитата Сообщение от SteelWing_RC Посмотреть сообщение
Компилятор выдает исключение "Индекс находится вне границ массива" при сверке первой буквы(строка 27).
Компилятор или при исполнении?

Добавлено через 11 минут
Проверил - всё нормально компилируется и исполняется. Возможно у Вас пустой файл "C:/Users/1/source/repos/Lab7/Lab7/test.txt" и из=за этого возникает ошибка.

Добавлено через 10 минут
И ещё рекомендация вместо подобной конструкции
C#
16
            char[] vow = { 'a', 'e', 'y', 'u', 'i', 'o', 'A', 'E', 'Y', 'U', 'I', 'O', };
гораздо удобнее использовать
C#
16
            char[] vow = @"aeyuioAEYUIO".ToCharArray();
А при разбивке Split в большинстве случаев (в том числе и Вашем) надо учитывать наличие переносов строк и исключать пустые элементы
C#
20
            StringArray = Entered.Split("\r\n ,/\\.:;!?"-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
Строки 15, 17, 20 можно сократить до одной
C#
20
            StringArray = (new StreamReader(file_path)).ReadToEnd().Split("\r\n ,/\\.:;!?"-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
Добавлено через 12 минут
Внутренний цикл for... со строки 25 проверяет только наличие символа в заданном массиве. Для этого можно использовать метод (Array.IndexOf в результате тело внешнего цикла сократится до 3 строк
C#
24
25
26
                str = StringArray[i];
                if (Array.IndexOf (vow, str[0])>=0)
                    Console.WriteLine(str.Remove(1).ToUpper() + str.Substring(1));
Добавлено через 5 минут
Внешний цикл у Вас перебирает слова больше у него нет функций поэтому логичнее его заменить на foreach... при этом переместив объявление переменной string str; в цикл. Весь код, с учётом вышесказанного, сократится до
C#
1
2
3
4
5
6
7
8
            string file_path = "test.txt";
            char[] vow = @"aeyuioAEYUIO".ToCharArray();
            foreach (string str in (new StreamReader(file_path)).ReadToEnd().Split("\r\n ,/\\.:;!?\"-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
            {
                if (Array.IndexOf (vow, str[0])>=0)
                    Console.WriteLine(str.Remove(1).ToUpper() + str.Substring(1));
            }
            Console.ReadKey();
1
1 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 24
19.10.2018, 19:52  [ТС] 3
Спасибо огромное! Однако не совсем понятна строчка:
if (Array.IndexOf (vow, str[0])>=0)
Можете, пожалуйста, объяснить?
0
Эксперт JS
6485 / 3896 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
19.10.2018, 20:09 4
Лучший ответ Сообщение было отмечено SteelWing_RC как решение

Решение

С регулярными выражениями задача естественнее смотрится. Они как раз и были созданы для работы с текстом.
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
25
26
27
28
29
30
31
32
33
34
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
 
namespace Lab7
{
    class Program
    {
        static void Main(string[] args)
        {
            string file_path = "C:/Users/1/source/repos/Lab7/Lab7/test.txt";
            string entered = File.ReadAllText(file_path, Encoding.UTF8);
 
 
            var matches = new Regex("[a-z]+", RegexOptions.IgnoreCase).Matches(entered);
            var stringArray = new string[matches.Count];
 
            for (int i = 0; i < stringArray.Length; i++)
            {
                var word = matches[i].Value;
                var first = word.Substring(0, 1);
                stringArray[i] = Regex.Replace(first, "[aeiouy]", first.ToUpper()) + word.Substring(1);
            }
            // Вывод
            for (int i = 0; i < stringArray.Length; i++)
            {
                Console.WriteLine(stringArray[i]);
            }
 
            Console.ReadKey();
        }
    }
}
1
Модератор
Эксперт .NET
15127 / 10416 / 2735
Регистрация: 21.04.2018
Сообщений: 30,852
Записей в блоге: 2
19.10.2018, 21:14 5
Лучший ответ Сообщение было отмечено SteelWing_RC как решение

Решение

Цитата Сообщение от SteelWing_RC Посмотреть сообщение
Спасибо огромное! Однако не совсем понятна строчка:
if (Array.IndexOf (vow, str[0])>=0)
Можете, пожалуйста, объяснить?
Метод Array.IndexOf ищет в массиве указанном в первом параметре, значение указанное во втором параметре.
Если находит, то возвращает индекс найденного элемента.
Если такого элемента нет - возвращает -1.
Проверяя по условию >= 0, фактически мы проверяем был ли найден такой элемент.
Так как в массиве vow у нас все гласные, то получается это проверка первого символа строки str[0] - относится он к гласным или нет.

Добавлено через 2 минуты
В коде ещё и лишние скобки стоят - можно убрать
C#
1
2
3
4
5
6
            string file_path = "test.txt";
            char[] vow = @"aeyuioAEYUIO".ToCharArray();
            foreach (string str in (new StreamReader(file_path)).ReadToEnd().Split("\r\n ,/\\.:;!?\"-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
                if (Array.IndexOf (vow, str[0])>=0)
                    Console.WriteLine(str.Remove(1).ToUpper() + str.Substring(1));
            Console.ReadKey();
1
1 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 24
19.10.2018, 21:19  [ТС] 6
Спасибо Вам большое!
1
19.10.2018, 21:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2018, 21:19
Помогаю со студенческими работами здесь

Индекс находится вне границ массива
Здравствуйте, ув форумчане. Я хотел добавить в свою программу сохранения и чтения историю ссылок....

Индекс находится вне границ массива
В чем ошибка? for (int c = 0; c &lt; text.Length; c++) // до длинны...

Индекс находится вне границ массива
Console.WriteLine(&quot;Введи те сколько?&quot;); int i = Convert.ToInt32(Console.ReadLine()); ...

Индекс находится вне границ массива
Здравствуйте. Подскажите, как исправить ошибку при парсинге. if (oneOid.Split('=').Trim() ==...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru