Я пытаюсь выполнить задание для колледжа по предмету программирования C.
Я выполнил свое задание на своем MacBook, и мой код работает отлично, как и предполагалось.Однако наш преподаватель сказал нам, что весь наш код будет скомпилирован с использованием сервера Solaris 10 для колледжа, и нам сказали, что если ваш код не будет компилироваться и выполняться на нем, оценки будут вычитаться.
Нам также сообщили, что наше приложение будет скомпилировано маркерами со следующим синтаксисом:
gcc -ansi -Wall -pedantic assign1.c -lm -o assign1
и выполнено с использованием:
./assign1
Мой код в настоящее времякомпилируется без ошибок и предупреждений и выполняется правильно.Тем не менее, одна из моих функций не работает, как ожидалось, на этой коробке Solaris.Предполагается, что эта функция является нашей собственной реализацией базовой сортировки строк - пользователь вводит строку длиной до 40 символов, и ее предполагается преобразовать в нижний регистр и отсортировать в алфавитном порядке, удалив все неалфавитные символы.
На моем Mac он выводит:
Enter a string (1-40 characters): asdfghjkl
Output: adfghjkls
На коробке Solaris колледжа выводит:
Enter a string (1-40 characters): asdfghjkl
Output: aa#?dfghjkls
Моя функция, которая выполняет (большую часть) вывод:
void sortLine(int *optionStats, char* source)
{
char tempsort[MAX_SORT_LENGTH + 1];
char comp_c;
int i,j,k;
char c = source[i++];
i = j = k = 0;
optionStats[2]++;
while (c != '\n' && c != '\0' && c != EOF) {
/* convert uppercase characters to lowercase */
if ((int)c >= (int)'A' && (int)c <= (int)'Z')
c = c + ((int)'a' - (int)'A');
/* if the character is alphabeic then sort it else skip it */
if ((int)c <= (int)'z' && (int)c >= (int)'a') {
for (j = 0; j <= MAX_SORT_LENGTH + 1; j++) {
comp_c = tempsort[j];
if (comp_c == '\n' || comp_c == '\0' || comp_c == EOF) {
tempsort[j] = c;
break;
}
if ((int)c <= (int)comp_c) {
for (k = MAX_SORT_LENGTH + 1; k > j; k--) {
tempsort[k] = tempsort[k - 1];
}
tempsort[j] = c;
break;
}
}
}
c = source[i++];
}
/* copy the sorted temporary array into the source array */
for (i = 0; i <= MAX_SORT_LENGTH + 1; i++) {
source[i] = tempsort[i];
}
}
Однако пара замечаний:
Само определение функции (подпись) предоставляется лектором, поэтому имена, типы возвращаемых данных, параметры и т. Д. Изменить нельзя,и мы должны использовать его как есть (однако мы можем делать все, что захотим внутри него).
Код должен соответствовать ANSI / C90 (grr!)
Может ли кто-нибудь помочь мне определить, из-за чего эти странные лишние персонажи выплевываются из этой функции - это заставляет меня задуматься?