2017-01-31 2 views
-1

Я пытаюсь свернуть голову вокруг этой проблемы в течение недели, но я не могу найти что-либо в сети, и я отказался от попытки ее решить самостоятельно.Указание на конкретный элемент в массиве символов

Мое задание - написать программу, которая будет читать имена из файла и принимать новые записи от пользователя, а затем сортировать данные и записывать их в файл. Единственное, что касается этого, заключается в том, что я должен сортировать их в функции и использовать указатели для этого. Этот код также должен быть написан на C++, используя массивы символов.

Код, который у меня есть сейчас, выглядит следующим образом. Это рабочая версия, единственная проблема заключается в том, что я не использую ни указатели, ни функцию для сортировки имен.

#include<iostream> 
#include<cstdlib> 
#include<fstream> 
#include<cstring> 

bool sorted; 

using namespace std; 

int main() 
{ 
    int i = 0; 
    int numNames = 0; 
    ifstream ifs; 
    ifs.open("namn.txt"); 

    char c[20][20]; 

    if(ifs.is_open()) 
    { 
     while(!ifs.eof()) 
     { 
      ifs >> c[i]; 
      i++; 
     } 
    } 

    cout<<"How many names do you want to enter?"<<endl; 
    cin>>numNames; 

    for(int l = i-1; l<numNames+i-1; l++) 
    { 
     system("cls"); 
     cout<<"Enter a name: "; 
     cin>>c[l]; 
    } 
    while(sorted == false) 
    { 
     for(int j = 0; j<numNames+i-1; j++) 
     { 
      for(int k = j; k<numNames+i-1; k++) 
      { 
       if(c[j][0] > c[k][0]) 
       { 
        char snorre[20]; 
        strcpy(snorre,c[j]); 
        strcpy(c[j],c[k]); 
        strcpy(c[k],snorre); 
       } 
       else if(c[j][0] == c[k][0]) 
       { 
        if(c[j][1] > c[k][1]) 
        { 
         char snorre[20]; 
         strcpy(snorre,c[j]); 
         strcpy(c[j],c[k]); 
         strcpy(c[k],snorre); 
        } 
       } 
      } 
     } 
     cout<<endl<<endl<<endl; 
     ofstream ofs; 
     ofs.open("namn.txt"); 
     for(int o = 0; o<numNames+i-1; o++) 
     { 
      cout<<c[o]<<" "; 
      ofs<<c[o]<<endl; 
     } 
     ofs.close(); 
     system("pause"); 
     sorted = true; 
    } 
} 

Так что, надеюсь, кто-то может помочь мне с этой проблемой, спасибо заранее! :)

+0

http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered- соната ng –

+0

Я думаю, что ваш вид не будет работать, если строки имеют первые 2 символа одинаковыми (и некоторые другие случаи) –

+0

, вероятно, предполагаемый ответ будет заключаться в создании массива указателей, каждый из которых указывает на одну строку, а затем сортирует указатели , а не использовать 'strcpy'. (Это абсолютно ужасно по современным стандартам кодирования, но похоже, что ваше задание не обновлялось с 1985 года) –

ответ

0

Чтобы получить код, чтобы использовать указатели и функцию, вы можете сделать this- вы должны изменить свой код и сделать его использовать следующее:

Первого, получить каждое имя из файла в std::string , используя getline(ifstream_object, std::string_object), для справки см. here.

Конвертировать каждый из них в const char * (также показано в этом примере), используя .c_str().

Сделайте следующее для каждого из введенных новых имен.

хранить все имена, введенные в этом массиве указателей: char *names[20];, как это: names[i] = name;

Далее Создать function такие следующим образом:

int location_of_bigger_string(const char* s1, const char* s2) 
{ 
    // Returns 1 if s1 should be before s2 and 2 otherwise 
    // This way, you use functions and pointers together. 
    // Use strcmp(s1,s2) here to determine returning value 
} 

strcmp(char*, char*) - читать об этом here.

Наконец, отсортировать все строки, используйте qsort или это example.

+0

после использования 'getline' с' string', строки можно сравнить с реляционными операторами и отсортировать с помощью 'sort'. –

+0

Удивительное объяснение! Попробуй это, когда я доберусь до своего компьютера, в настоящее время по дороге домой. – Yoldrim

0

Вот полный код,

Обратите внимание, что функция сравнения получает указатели на элементы, при этом элементы сами являются указателями, так что передается «сравнить» функция типа «гольца **»

{ 

#include "stdafx.h" 
#include<iostream> 

//retruns +1 if str1 > str2 alphabetically 
int compare(const void * a, const void * b) 
{ 
    const char * str1 = *((const char **)a); 
    const char * str2 = *((const char **)b); 

    int i; 
    for (i = 0 ; str1[i] && str2[i] ; i++) 
    { 
     if (str1[i] > str2[i]) 
     { 
      return +1; 
     } 
     else if (str1[i] < str2[i]) 
     { 
      return -1; 
     } 
    } 

    //one or both strings have ended 


    if (str1[i]) //str1 is longer 
     return +1; 
    else if (str2[i]) //str2 is longer 
     return -1; 
    else 
     return 0; 
} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char * names[]={"Zebra","Kousha","Koosha","Kou","Koush","Test"}; 

    qsort(names, 6, sizeof(char *), compare); 

    return 0; 
} 

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