Je suis assez nouveau à ce sujet, donc j'ai essayé de compiler le principal à la page 119 (§5.11) le long de ses dépendances. J'ai réussi à obtenir une construction propre avec ceci:Essayer qsort sur K & R "Le langage de programmation C"
#include <stdio.h>
#include <string.h>
#define ALLOCSIZE 10000
#define MAXLINES 5000
#define MAXLEN 1000
int getline(char *, int);
char *alloc(int);
char *lineptr[MAXLINES];
int readlines(char *lineptr[], int nlines);
void writelines(char *lineptr[], int nlines);
void qsort(void *lineptr[], int left, int right,
int (*comp)(void *, void *));
int numcmp(char *, char *);
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;
/* getline: read a line, return length */
int getline(char *line, int max)
{
if (fgets(line, max, stdin) == NULL)
return 0;
else
return strlen(line);
}
char *alloc(int n)
{
if (allocbuf + ALLOCSIZE - allocp >= n) {
allocp += n;
return allocp - n;
} else
return 0;
}
/* readlines: read input lines */
int readlines(char *lineptr[], int maxlines)
{
int len, nlines;
char *p, line[MAXLEN];
nlines = 0;
while ((len = getline(line, MAXLEN)) > 0)
if (nlines >= maxlines || (p = alloc(len)) == NULL)
return -1;
else {
line[len-1] = '\0'; /* delete newline */
strcpy(p, line);
lineptr[nlines++] = p;
}
return nlines;
}
/* writelines: write output lines */
void writelines(char *lineptr[], int nlines)
{
int i;
for (i = 0; i < nlines; i++)
printf("%s\n", lineptr[i]);
}
void swap(void *v[], int i, int j)
{
void *temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
/* qsort: sort v[left]...v[right] into increasing order */
void qsort(void *v[], int left, int right,
int (*comp)(void *, void *))
{
int i, last;
void swap(void *v[], int, int);
if (left >= right)
right;
swap(v, left, (left + right)/2);
last = left;
for(i = left+1; i <= right; i++)
if((*comp)(v[i], v[left]) < 0)
swap(v, ++last, 1);
swap(v, left, last);
qsort(v, left, last-1, comp);
qsort(v, last+1, right, comp);
}
#include <stdlib.h>
/* numcmp: compare s1 and s2 numerically */
int numcmp(char *s1, char *s2)
{
double v1, v2;
v1 = atof(s1);
v2 = atof(s2);
if (v1 < v2)
return -1;
else if (v1 > v2)
return 1;
else
return 0;
}
/* strcmp01: return <0 if s<t , 0 if s==t, >0 if s>t */
int strcmp01(char *s, char *t)
{
for(; *s == *t; s++, t++)
if(*s == '\0')
return 0;
return *s - *t;
}
/* sort input lines */
main(int argc, char *argv[])
{
int nlines;
int numeric = 0;
if (argc > 1 && strcmp01(argv[1], "-n") == 0)
numeric = 1;
if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
qsort((void **) lineptr, 0, nlines-1,
(int (*)(void*,void*))(numeric ? numcmp : strcmp01));
writelines(lineptr, nlines);
return 0;
}
else {
printf("input too big to sort\n");
return 1;
}
}
Mais quand je le lance dans une fenêtre DOS (Windows 7 pour ce qu'il vaut la peine), l'invite de commande de curseur accepte plusieurs lignes d'entrée d'entrée clé, et .. . Et quoi exactement? Après avoir tapé quelques lignes de geek, rien ne se passe. J'ai juste Ctrl C en dehors et je suis de retour à une invite de commande.
Alternativement je compose quelques lignes de choses dans un fichier test.txt et essayé de courir
[DIR\]mybuild.exe <[DIR\]test.txt
Cela jette juste une erreur (une victoire 7 apparaît de dialogue qui dit « mybuild.exe a cessé de fonctionner "). Il trouve le fichier test.txt; ça "arrête de fonctionner".
Que puis-je faire pour exécuter ce programme avec succès? (J'essaie juste de ne jamais l'avoir vu courir avant.) Merci à tous pour votre aide.
Merci. Avant que je trouve la redirection dans le livre, je sentais quelque chose comme fopen allait devoir être employé. En supposant que l'ajout à une fonction de la bibliothèque serait un non non, même si juste pour faire quelque chose, j'étais, et je ne suis toujours pas sûr de la façon de placer cela dans le code que j'ai déjà copié du livre. Je voudrais même coder en dur un chemin de fichier dedans, mais je ne suis pas sûr dans quel snip il devrait être. – user225626
Vous pouvez simplement le mettre dans le main, de cette façon vous pouvez ensuite tester le reste de votre code, comme vous appellerez alors normalement vos fonctions de bibliothèque, puisque vous avez l'information dont vous avez besoin. –