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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2016, 02:17   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Почему не выводит строки? Си

Здравствуйте. Задание состоит в том,чтобы выделить имя,т.е второе слово строки (первое слово-фамилия). В массив строк вводится фамилия и имя,а потом имена нужно занести в отдельный массив. При запуске ничего не выводит, просто пустое поле подскажите пожалуйста в чем дело? Когда вместо массива строк передаю в функцию findAlpha просто символьный массив, все нормально находит и выводит, а проблемы именно с массивом строк
Код:
// 37.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string>
#define S 5
#define MAXLENGTH 20
 
#include <iostream>
#include <cctype>
 
using namespace std;
char *findAlpha( char *s )
{
    int i = 0;
    for ( ; s[ i ] && !isalpha( s[ i ] ); ++i );
    return &s[ i ];
}
 
char *findSpace( char *s )
{
    int i = 0;
    for ( ; s[ i ] && !isspace( s[ i ] ); ++i );
    return &s[ i ];
}
 
 
 
int main()
{
  char **students=(char**)malloc(S*S*sizeof(char));
  char buf[100];
  int len=S;
for(int i=0;i<S;i++)
   {
 
 
       scanf("%s",buf);
       students[i] = (char*)malloc (strlen(buf)*sizeof(char) );  
       strcpy(students[i], buf); 
       fflush(stdin);
   }
     
 
  
  char *t;
 
 
 
    for(int j=0;j<S;j++)
    {       
        t = findAlpha( findSpace( findAlpha( students[j] ) ) ); //НЕ РАБОТАЕТ
         for ( int i = 0; t[ i ] && !isspace( t[ i ] ); ++i )
          cout << t[ i ]; //НИЧЕГО НЕ ВЫВОДИТ
              cout << endl; 
    }
    
 
 
}
Вероника99 вне форума Ответить с цитированием
Старый 14.12.2016, 09:53   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Давай по порядку.

Во-первых, ты здесь неправильно выделяешь память.
Код:
char **students=(char**)malloc(S*S*sizeof(char));
- выделит 5 * 5 * 1 = 10 байт всего. Должно быть, видимо, S * sizeof(char*);
Код:
students[i] = (char*)malloc (strlen(buf)*sizeof(char) );
- а тут ты не выделяешь место для нулевого символа в конце строки; должно быть strlen(buf) * sizeof(char) + 1.
И да, вместо
Код:
students[i] = (char*)malloc (strlen(buf)*sizeof(char) + 1 ); strcpy(students[i], buf);
можно писать просто
Код:
students[i] = strdup(buf);
Ну а главная ошибка, из-за которой ничего не выводится - scanf читает строки до первого разделителя. Разделителем является и конец строки, и пробел. Потому у тебя каждое слово читалось отдельно.
Вместо сканфа можно, например, написать
Код:
gets_s(buf, 100);
, тогда все должно работать.
Son Of Pain вне форума Ответить с цитированием
Старый 14.12.2016, 13:35   #3
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Спасибо,заработало))
Вероника99 вне форума Ответить с цитированием
Старый 14.12.2016, 14:13   #4
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Еще возник такой вопрос, как полученные вторые слова, занести в отдельный массив, в котором слова разделялись бы пробелом. Что-то у меня не получается
Код:
  char *t;
 char buf2[100];
  int k=0;
  //char *str=(char*)malloc(strlen(buf)*sizeof(char)*S+1);
   char str[S][5];
	for(int j=0;j<S;j++)
	{		
		t = findAlpha( findSpace( findAlpha( students[j] ) ) );
		 for ( int i = 0; t[ i ] && !isspace( t[ i ] ); ++i )
		 {
			 cout << t[ i ];
			 buf2[i]=t[i];
		    
		  
		 }
		  strcat( buf2," ");

		cout<<"\n"<<buf2<<endl;
	   // strcat( str[j], buf2);
		
		 cout << endl;	
	}
	 cout << endl;	 cout << endl;	

	//for(int i=0;i<S;i++)

		//cout<<str[i]<<endl;
Вероника99 вне форума Ответить с цитированием
Старый 14.12.2016, 15:57   #5
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Вероника99 Посмотреть сообщение
Код:
for(int j=0;j<S;j++) {		
   t = findAlpha( findSpace( findAlpha( students[j] ) ) );
   for ( int i = 0; t[ i ] && !isspace( t[ i ] ); ++i ) {
      cout << t[ i ];
      buf2[i]=t[i];
   }
   strcat( buf2," ");
...
Код:
char *p = buf
for(int j=0;j<S;j++) {		
   t = findAlpha( findSpace( findAlpha( students[j] ) ) );
   for ( int i = 0; t[ i ] && !isspace( t[ i ] ); ++i ) {
      cout << t[ i ];
      *p++ = t[i]; // buf2[i]=t[i];
   }
   *p++ = ' '; // strcat( buf2," ");
...
*p = '\0';
olej.tsil вне форума Ответить с цитированием
Старый 15.12.2016, 15:23   #6
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Спасибо)
Вероника99 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему ASC|| не выводит значение '\' WildWhiteRabbit Помощь студентам 3 05.06.2015 21:30
Почему не выводит ответ? oleg866 Помощь студентам 1 01.06.2014 01:37
Почему выводит ноль? _Лето_ Общие вопросы C/C++ 4 14.11.2013 09:11
Почему то выводит только верхнюю строку массива(всего 4 строки) Nikitos_ Паскаль, Turbo Pascal, PascalABC.NET 10 06.06.2012 00:14
Почему выводит строку 2 раза?!?!?! Dasharnb777 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 17.11.2010 11:06