Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2012, 21:14   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
Стрелка Ошибка при выводе строкового массива

Доброе время суток. Столкнулся с такой проблемой. Ввожу массив строк. Если в строке нет числа то записываю его во второй массив и вывожу. Выходной массив с какими-то каракулями. Где я ошибся или может переусердствовал.

Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>

main()
{
char gwords[5][15], temp[15];
int i, j, ch, y, n;
 
i=0;
j=0;
printf("Введите 5 слов: \n");
while(i<5)
     {
  	 gets(temp);
  	 n = strlen(temp);
	   while(j<n)
		  {
	   	       if(temp[j]>='0' && temp[j]<='9') {ch++; j=15;} 
		  	   else {strcpy(gwords[i], temp); j++;}
          } 
i++;	  
}
if(ch==1)
     printf("Массив содержит 1 строку с цифрами");
else
	 printf("Массив содержит %d строки с цифрами",ch);
puts("\nСледующие слова соответствуют условию:");
for(y=0; y<5; ++y)
     puts(gwords[y]);
getch();
return 0;
}
Си.jpg
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось ACE Valery; 30.03.2012 в 21:30.
Bugrimov вне форума Ответить с цитированием
Старый 30.03.2012, 21:38   #2
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Мне обычно помогал
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Для того, чтоб они работали, нужно подключить <windows.h>. И в консоле не забудьте в свойствах поменять шрифт на Lucida Console. Хотя мне кажется, бага совсем не в этом, потому что вывод фраз у вас идет-то нормальным языком, а не кракозябрами (у меня, например, без этих команд, сразу абаркадабра на экран вылазит при запуске вашей проги)

А вот прога ваша у меня не отработала. Во-первых, ругается на то, что переменная ch не инициализирована, а вы ей ++ делаете. Во-вторых, не понятно, почему j=15. В-третьих, точно не помню, но, кажется функция strcpy не добавляет терминирующий ноль('\0') в конец строки, поэтому тут может быть бага.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать

Последний раз редактировалось ACE Valery; 30.03.2012 в 21:41.
ACE Valery вне форума Ответить с цитированием
Старый 30.03.2012, 21:39   #3
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Так нельзя:

Код:
for(y=0; y<5; ++y)
     puts(gwords[y])
Массив может содержать меньше пяти слов.

Здесь

Код:
{ch++; j=15;}
Наверное, лучше break использовать вместо j=15.

В конце первой итерации ch становится равным n и все проверки прекращаются. Поэтому в массив результатов попадает только первое слово. А выводится мусор (из-за y<5). Нужно обнулять после каждого цикла.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 30.03.2012, 21:42   #4
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

ACE Valery, скорее всего ch по умолчанию проинициализировалась нулём, поэтому у автора и отработало.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 30.03.2012, 22:40   #5
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

что-то не особо получается с выводом, буду дальше думать.... Спасибо за советы
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 30.03.2012, 22:44   #6
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Цитата:
Сообщение от sVasilich Посмотреть сообщение
В конце первой итерации ch становится равным n и все проверки прекращаются. Поэтому в массив результатов попадает только первое слово. А выводится мусор (из-за y<5). Нужно обнулять после каждого цикла.
Извиняюсь, не ch, а j.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 30.03.2012, 22:56   #7
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Сейчас пытаюсь доработать вот этот код.

Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>

main()
{
char gwords[5][15], temp[15];
int i, j, cs;
 
i = 0;
j = 0;
cs = 0;

printf("Ââåäèòå 5 ñëîâ: \n");
while(i<5)
     {
  	 gets(temp);
  	
	   while(temp[j]!='\0')
		  {
	   	       if(temp[j]>='0' && temp[j]<='9') break;
		  	   else {j++; }
          
          } strcpy(gwords[i], temp); cs++;
i++;	  
}
puts("\nÑëåäóþùèå ñëîâà ñîîòâåòñòâóþò óñëîâèþ:");
for(i=0; i<cs; i++)
     puts(gwords[i]);
getch();
return 0;
}
Как сделать чтобы вносилось только строка содержащая только буквы. Он сейчас все строки заносит в выходной массив
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось ACE Valery; 30.03.2012 в 23:11.
Bugrimov вне форума Ответить с цитированием
Старый 30.03.2012, 23:46   #8
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Код:
for(int i=0;i<5;i++)  //инициализация i в начале теперь не нужна
{
  gets(temp);

  bool isHasDigits = false;

  int j=0; //инициализацию j в начале программы убрать.
  while(temp[j]!='\0')
  {
     if(temp[j]>='0' && temp[j]<='9')
     {
       isHasDigits = true;
       break;
     }
     j++;     
  } 

   if(!isHasDigits)
   {
     strcpy(gwords[i], temp);
     cs++;
   }

}
Как-то так. Только я не компилировал, проверь.

А все строки заносил потому, что break'ом прерывался только внутренний цикл while.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...

Последний раз редактировалось sVasilich; 31.03.2012 в 00:37.
sVasilich вне форума Ответить с цитированием
Старый 31.03.2012, 17:57   #9
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Так все правильно работает. Но вывод на экран происходит с ошибкой. CS подсчитывает количество строк. Но строка выводится с иероглифами. Почему это может происходить?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 01.04.2012, 06:29   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Так все правильно работает. Но вывод на экран происходит с ошибкой. CS подсчитывает количество строк. Но строка выводится с иероглифами. Почему это может происходить?
http://yandex.ru/yandsearch?text=%D1...1%2B%2B&lr=240
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с деструктором при выводе массива WebbMan Общие вопросы C/C++ 6 28.03.2011 22:23
Ошибка при выводе xml DKENT Работа с сетью в Delphi 0 08.02.2011 21:49
Ошибка при выводе trad Общие вопросы C/C++ 7 15.01.2011 11:32
Отступы при выводе массива Kasper1 Общие вопросы по Java, Java SE, Kotlin 1 03.01.2011 23:20
Портится кодировка при выводе массива в файл delias Win Api 3 20.04.2010 10:05