C - Массивы, сортировка и изменение - PullRequest
0 голосов
/ 29 декабря 2011

Работал над задачей, которая была предметом целого ряда других вопросов о 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 ]

2 голосов
/ 29 декабря 2011

Вы можете использовать sprintf:

void AppendInt(char *line, int val, int length) {
    capitalise(line);
    sprintf(line+length, "%d", val);
}
0 голосов
/ 29 декабря 2011

Считаете ли вы, что val не является символом, поэтому он не пригоден для печати ...

, чтобы решить, что: sprintf(&line[length],"%d",val);

вы должны быть уверены, что выделите достаточно памятидля строки, содержащей val.

...