2016-11-23 12 views
0

Я пытаюсь в алфавитном порядке сортировать пользовательский ввод с максимальным количеством 10 000 слов и максимальной длиной в 25 слов. Я использую «stop», чтобы досрочно завершить работу пользователя, что приводит меня к некоторым проблемам. Текущие результаты программы в следующем виде вывода при попытке ввода привета остановитьСортировка пользовательского ввода в лексикографических символах возвращаемой памяти?

▒l▒ 
0▒l▒ 
A{▒ 
e▒ 



▒& 
▒▒ 
▒▒ 
▒▒ 
▒▒ 
▒l▒ 
▒l▒ 
▒▒; 
▒Se▒ 
▒ 
▒ 
▒ 
▒ 





▒! 
Ќl▒ 
▒ 
▒ 
▒ 
▒.X 

▒ 

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

#include<stdio.h> 
#include <string.h> 

//for using tolower 
#include <ctype.h> 
int main() { 
    int i, k, j; 
    char abc[25]; 
    const char *stop = "stop"; 
    char *p; //using for lowercase 
    //using 2d array for max of 10,000 words, max size of words 25 
    char str[10000][25], temp[25]; 

    printf("Enter up to 10000 words, type stop to enter the current words:\n"); 
    while (strncmp(abc, "stop", 5) != 0) { 
     scanf("%s", abc); 
    } 
     //for (i = 0; i < 10000; ++i) 
      //scanf("%s[^\n]", str[i]); 

     for (i = 0; i < 10000; ++i) 
      for (k = i + 1; k < 10000; ++k) { 
       //comparing two strings using strcmp() function is used 
       //using strcpy() to copy string to a temp 
       if (strcmp(str[i], str[k]) > 0) { 
        strcpy(temp, str[i]); 
        strcpy(str[i], str[k]); 
        strcpy(str[k], temp); 
       } 
      } 

     //using pointer to converting to lowercase 
     //src: https://www.daniweb.com/programming/software-development/threads/57296/how-does-one-tolower-an-entire-string 
     for (p = str; *p != '\0'; p++) 
      *p = (char) tolower(*p); 

     //printing words in lexi order 
     printf("\nWords in lexicographical order: \n"); 
     for (i = 0; i < 10000; ++i) { 
      puts(str[i]); 
     } 
     printf("WARNING: Words longer than 25 in length were ignored. \n"); 

     return 0; 

} 
+2

Вы не сохраняете вход string в массив 'str'. – BLUEPIXY

+2

Кроме того, 'abc' не инициализируется при первом запуске цикла while. Поднимите предупреждения компилятора и исправьте их все, прежде чем отправлять вопрос. И научитесь использовать отладчик. Проблемы должны быть понятны, если вы использовали отладчик. – kaylum

+0

@WhozCraig Действительно ли этот сарказм необходим? Кроме того, «datum» неверно в вашем предложении. Это должны быть множественные «данные». – DIMMSum

ответ

1

код имеют следующие серьезные проблемы (не стесняйтесь игнорировать строчной указатель, по-прежнему работает на получение выходного сигнала, чтобы включить в нижний регистр!):

  • str массив строк не инициализирован. Он может содержать полный мусор, включая строки без нулевого терминатора.
  • более поздние утверждения перебирают все эти строки мусора, которые могут (и вообще) не так хорошо заканчиваться ...
  • ваш цикл «опускания», так как вы не обрабатываете массив строк, как если бы это было одиночная строка.
  • вы читаете много строк во временной переменной, но вы ничего не делаете с ними.

Чтобы решить эту проблему, необходимо следить за количеством элементов в массивах и итерацию только через действительные строки:

int n=0; 
while (scanf("%24s", abc)>0 && strncmp(abc, "stop", 5) != 0) { 
    strncpy (str[n++], abc, 25); 
} 

for (i = 0; i < n; ++i) 
    for (k = i + 1; k < n; ++k) { 
     ... 
    } 
    ... 
} 
for (i =0; i<n; i++) 
    for (p = str[i]; *p != '\0'; p++) 
     *p = (char) tolower(*p); 
... 
for (i = 0; i < n; ++i) { 
     puts(str[i]); 
} 
... 

Здесь online demo

+0

Спасибо, что выбрали мой беспорядок! Я ценю это, исправит все проблемы! – Nuggets10

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

  • Нет связанных вопросов^_^