C - Массивы, сортировка и изменение
Работал над задачей, которая была предметом целого ряда других вопросов о SO! Я дошел до стадии, когда снова пытаюсь добавить число в массив, хотя на этот раз код более сложен в том, как информация передается в параметрах.
РЕДАКТИРОВАТЬ: код также ниже
Извините за это, но, пожалуйста, оштрафуйте код: http://pastebin.com/8SUjRyZQ
Здесь слишком много места для поста на форуме.
Проблема в том, что это не добавление числа, а просто мусор, хотя на этот раз я действительно не понимаю, почему, поскольку я учел все предложения из моих предыдущих вопросов по этой теме.
Он должен добавить число, int val, к массиву, в пределах void AppendInt
функции, думал, что это просто добавление мусора.
Что ж, в Notepad++ он печатает Word - PasswordBOH - BOH, представляющий собой какой-то случайный мусор, похожий на изображение, BOH в белом тексте с черным фоном.
Любая помощь приветствуется!
PS> Если нужно, я могу выложить код здесь, но это значительный кусок.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXLINES 5000 /* max no. lines to be stored */
#define MAXLEN 1000 /* max length of single line */
char *lineptr[MAXLINES];
void capitalise(char *line);
void decision(int i, char *line, int val);
void writelines(char *lineptr[], int nlines);
void qksort(char *v[], int left, int right);
void swap(char *v[], int i, int j);
void AppendInt(char *line, int val, int length);
int main(int argc, char *argv[]) {
int nlines = 0, j, k, i = 0;
char line[MAXLEN];
FILE *fpIn;
printf("WLO v1.0 Alpha Release - Coded in C - Big Shout to StackOverFlow!\n");
printf("1.QuickSort List.\n");
printf("2.QuickSort - Capitalise Word[0]\n");
printf("3.QuickSort - Capitalise Word[0] - Append X\n");
scanf("%d", &k);
if(k == 3) {
printf("Enter the value you wish to append (a single Integer): ");
scanf("%d", &i);
}
fpIn = fopen(argv[1], "rb");
while((fgets(line, 65, fpIn)) != NULL) {
j = strlen(line);
if (j > 0 && (line[j-1] == '\n')) {
line[j-1] = '\0';
}
if (j > 8) {
if(k != 1)
decision(k, line, i);
lineptr[nlines++] = strdup(line);
}
}
qksort(lineptr, 0, nlines - 1);
writelines(lineptr, nlines);
return 0;
}
void decision(int i, char *line, int val) {
if(i == 2)
capitalise(line);
else if(i == 3)
AppendInt(line, val, strlen(line));
}
void capitalise(char *line) {
line[0] = toupper((line[0]));
}
void AppendInt(char *line, int val, int length){
capitalise(line);
line[length] = val;
line[length + 1] = '\0';
}
void writelines(char *lineptr[], int nlines) {
FILE *fpOut;
int i;
fpOut = fopen("tmp.out", "wb");
for(i = 0; i < nlines; i++)
fprintf(fpOut, "%s\n", lineptr[i]);
}
void qksort(char *v[], int left, int right) {
int i, last;
void swap(char *v[], int i, int j);
if (left >= right)
return;
swap(v, left, (left + right)/2);
last = left;
for (i = left+1; i <= right; i++)
if (strcmp(v[i], v[left]) < 0)
swap(v, ++last, i);
swap(v, left, last);
qksort(v, left, last-1);
qksort(v, last+1, right);
}
void swap(char *v[], int i, int j) {
char *temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
2 ответа
Ты можешь использовать sprintf
:
void AppendInt(char *line, int val, int length) {
capitalise(line);
sprintf(line+length, "%d", val);
}
Вы считаете, что val не char, поэтому он не печатается...
чтобы решить это: sprintf(&line[length],"%d",val);
Вы должны быть уверены, что выделите достаточно памяти для строки, чтобы содержать val.