2017-02-19 2 views
0

Требуется, чтобы мой массив символов находился в структуре, но он сбой.Сканирование массива символов и его правильное размещение в C++

Как я понял после, также возникает проблема при сканировании массива.

Вводная строка состоит из двух слов, имени и фамилии, разделенных пробелом. Я еще не написал часть, где он сканирует второе слово, поэтому теперь он сканирует только первый.

Контрольные строки в коде имеют странный выход. Я ввожу «Джеймс», и он дает мне «J8224a8224m8224e8224s8224», а затем падает.

#include <iostream> 
#include<string.h> 

using namespace std; 
struct base 
{ 
    char* name; 
    char* surname; 
    int point1; 
    int point2; 
}; 
main() 
{ 
    setlocale(LC_ALL, "rus"); 
    int n; 
    cin >> n; 
    base a[n]; 
    char symb; 
    char sym[20]; 
    int j = 0; 
    for (int i = 0; i < n; i++) 
    { 
     do 
     { 
      symb = getchar(); 
      sym[j] = symb; 
      j++; 
     } while (symb != ' '); 

     for (int k = 0; k < j; k++) //check 
      cout << sym[k] << ' '; //check 

     strcpy(sym, a[i].name); 
     j = 0; 
    } 
} 
+0

'STRCPY (Sym, а [я] .name);' Вы копирования символов в памяти, пока не существует! Вероятно, есть еще одна проблема, основанная на выводе. –

+0

У вас есть указатели в структуре, но вы не указываете их нигде. Кроме того, технически ваша программа не является допустимой программой на C++, потому что C++ не имеет [массивы переменной длины] (https://en.wikipedia.org/wiki/Variable-length_array). Это расширение в некоторых компиляторах, избегайте их. –

+0

'base a [n]' is gcc extension, 'cout << sym [k] << ''' использует два пробела, поэтому это многосимвольный символ – xinaiz

ответ

0

Есть несколько ошибок:

  1. Вы не можете использовать статическую инициализацию для базы а [п], потому что переменная п не известно во время компиляции.
  2. Вы должны инициализировать имя [i] перед тем, как выполнить команду strcpy.
  3. Вы можете использовать sptncpy вместо strcpy, если знаете длину, которая равна j.

Вы код должен выглядеть следующим образом

int main() 
{ 
    setlocale(LC_ALL, "rus"); 
    int n; 
    cin >> n; 
    base *a = new base[n]; 
    char symb; 
    char sym[20]; 
    int j = 0; 
    for (int i = 0; i<n; i++) 
    { 
     do 
     { 
      symb = getchar(); 
      sym[j] = symb; 
      j++; 
     } while (symb != ' '); 

     for (int k = 0; k<j; k++) //check 
      cout << sym[k] << ' '; //check 

     a[i].name = new char[j]; 
     strncpy(sym, a[i].name, j); 
     j = 0; 
    } 
} 
+1

Ну, стоит упомянуть, что есть пути C++ - ish для этого. –

Смежные вопросы