Errata da Tradução de k&r
Esta página apresenta a errata que fiz para o livro KERNIGHAN,B.W. & RITCHIE,D.M. A Linguagem de Programação C. Padrão ANSI. Rio de Janeiro, Editora Campus, 1990. 289p.. Parece que a Editora Campus não vai mesmo lançar uma edição corrigida do livro 😡. Afinal, depois de anos, ela relança a mesma edição com erros e mais erros de tradução. Quem puder ler o original em inglês, é melhor.
Vamos dividir por capítulos. Vou fazer aos poucos, pois é muita coisa.
Cap 1
4 erros
item 1.5.1
Pág. 16
Na primeira linha temos:
c-getchar();
O correto é:
c=getchar();
item 1.5.2
Pág. 17
Neste, a mudança vai ser sutil e
possivelmente você não vai ver a diferença. No programa, a linha
printf("%1d\n",nc);
deve ser escrita:
printf("%ld\n",nc);
Desfazendo o mistério: na
primeira versão, errada, temos l
, que é o número um
. Na segunda
versão, correta, temos l
, que é a letra éle
.
item 1.5.4
<box 100% round orange|Pág. 19> No final da página, última linha:
No lugar de **}**
Deve ser escrito: **{**
item 1.9
Pág. 28
Quase no final do programa, na função
copia
, temos
while ((para[i]= de[i]!='\0')
deveria ser:
while ((para[i]= de[i])!='\0')
Cap 2
5 erros
item 2.3
Pág. 37
No final da página, a quarta linha de
baixo para cima, temos:
#define BELL '\xx7' /* caractere de alerta em ASCII */
O correto é:
#define BELL '\x07' /* caractere de alerta em ASCII */
ou
#define BELL '\x7' /* caractere de alerta em ASCII */
item 2.4
Pág. 40
Na linha 11, temos:
float eps = 1.0e = 5;
O correto é:
float eps = 1.0e-5;
item 2.5
Pág. 40
Temos a expressão:
if((ano & 4 == 0 && ano & 100 != 0) || ano % 400 == 0)
O correto é:
if((ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0)
item 2.8
Pág. 46
No meio da página temos na função comprime(char s[],int c):
int o,j;
O correto é:
int i,j;
Pág. 47
Na função strcat
, temos:
while(s[i++]=t[j++])!= '\0') /*copia t */
O correto é (falta uma abertura de parêntesis e a vírgula após o comando
while):
while((s[i++]=t[j++])!= '\0') /*copia t */
;
item 2.9
Pág. 48
Na primeira linha,falta o operador | na frase:
Deve-se distinguir os operadores bit-a-bit & e dos operadores lógicos && e
deve ser escrita:
Deve-se distinguir os operadores bit-a-bit & e | dos operadores lógicos && e ||
\
No meio da página, a expressão
return (x>>(p+1-n)&~(~0<<n);
falta fechar um parêntesis. Deve ser:
return (x>>(p+1-n))&~(~0<<n);
Item 2.10
Pág. 49
No meio da página, temos:
x=x*(y+2)
O correto é:
x=x*(y+1)
Item 2.12
Pág.50
Na tabela 2.1, na última linha, está
escrito:
. esquerda para direita
O o operador correto não é ponto, mas vírgula:
, esquerda para direita
Também, embaixo da tabela, está escrito:
Unários +,- e * têm maior precedência que as formas binárias.
O correto é
Unários &,+,- e * têm maior precedência que as formas binárias.
Cap 3
5 erros
Item 3.2
Pág.54
Na última linha, antes do final o
item, temos:
expressão como "z-a;" é...
O correto é:
expressão como "z=a;" é...
Item 3.3
Pág.55
No programa pesqbin(), na linha
if (x<v[meio]
O correto é (erro do original em inglês):
if (x<v[meio])
\
Item 3.5
Pág.60 - Exercício 3-3**
Na segunda linha temos:
como a=z na cadeia...
O correto é:
como a-z na cadeia...
Item 3.6
Pág.61
Na função itoa:
do } /* gera digitos em ordem invrtida */
O correto é:
do { /* gera digitos em ordem invrtida */
Item 3.7
Pág.62
No programa apara, na linha antes
do return temos:
s[n+1]\'\0';
O correto é:
s[n+1]='\0';
Cap 4
13 erros
Item 4.1
Pág.67
Na função lelinha temos:
while (==lin>0 && (c=getchar())!-EOF && c!='\n')
O correto é:
while (--lim>0 && (c=getchar())!=EOF && c!='\n')
Item 4.2
Pág.69
Na última frase do primeiro parágrafo,
temos:
A biblioteca-padrão inclui uma função atof; o arquivo cabeçalho <math.h> a declara.
O correto é:
A biblioteca-padrão inclui uma função atof; o arquivo cabeçalho <stdlib.h\> a declara.
Nesta mesma página, a função atof está declarada como:
double atof(chars[])
O correto é:
double atof(char s[])
Nesta função temos ainda, no primeiro if:
if (s[i]=='+'\\s[i]=='-')
O correto é:
if (s[i]=='+'||s[i]=='-')
Mais abaixo, temos:
val = 10.0;*val + (s[i]-'0');
O correto é:
val = 10.0*val + (s[i]-'0');
Pág.70
Depois do meio da página, temos a expressão:
sum += atof(linha)
O correto é:
soma += atof(linha)
Item 4.3
Pág.73
No programa temos:
#include <math.h> /* para atof() */
O correto é:
#include <stdlib.h> /* para atof() */
Pág.76
Falta fechar a função ungetch(int c)
com }
Item 4.4
Pág.78
No terceiro parágrafo, na última frase, o correto é (tem que retirar o em:
Mas estes nomes não são visíveis em main, e nem
em empil e desempil.
Item 4.6
Pág.80
No cabeçalho dos blocos, substituir o
segundo obtemop.c
por getch.c
Item 4.9
Pág.83
Na primeira linha da página:
variáveis automáticas também são inicializadas com zero. Apenas as variáveis em
registradores têm valor indefinido.
Item 4.10
Pág.85
No programa qsort, após a linha:
ultimo = esq;
inserir:
for (i=esq+1; i<=dir; i++)
Item 4.11,2
Pág.88
O correto, no meio da página é:
a macro é expandida para printf("x/y""=%g\n",x/y);
Cap 5
Item 5.4
Pág.102
Na quarta linha correto é:
p-s
e não
p+s
.
Item 5.5
Pág.104
Na segunda linha, de cima para baixo,
o correto é:
t++;
e mais nada.
Pág.104
Nos dois strcpy, faltou o ;
depois do
while
:
while ((*s++ = *t++) != '\0')
;
Pág.105
Na função strcmp, o correto é:
if(*s=='\0')
.
Pág.105
Na linha que começa com
Desde que
, o correto é operadores
. Está escrito operados
Pág.105
No exercício 5-3 o correto é
strcat
(está escrito stract
)
Item 5.6
Pág. 107
Na penúltima linha, o correto é:
linha[tam-1]='\0';
(falta abrir aspas simples).
Pág.109
Na função qsort, o correto é:
qsort(v,esq,ultimo-1);
(ultimo
em vez de ult
).
Item 5.7
Pág.110
A declaração correta é:
int dia_do_ano(int ano, int mes, int dia)
(com sublinha em vez de hífen).
O mesmo em:
void dia_do_mes(int ano, int diaano, int *ames, int *adia)
Pág.111
Na linha:
seria um vetor de 13 apontadores para inteiros. Em geral somente a primeira...
O correto é:
seria um vetor de 13 apontadores para inteiros. Generalizando, somente a primeira...
Item 5.9
Pág.112
No primeiro parágrafo do item, linha 9, o correto é:
20xlinha+col é usado para encontrar o elemento a[linha][col]
.
Item 5.10
Pág.114
No primeiro e no segundo ecoa do
item, em vez de:
printf("%s%s",argv[i],(i<argc-1)?""":"");
O correto é:
printf("%s%s",argv[i],(i<argc-1)?" ":"");
.
No terceiro ecoa, em vez de :
prin)f((argv>1)?"%s":"%s",*++argv);
o correto é:
printf((argv>1)?"%s ":"%s",*++argv);
Pág.115
Na função main, o correto é:
while(lelinha(linha,MAXLIN)>0)
e
if(strstr(linha,argv[1])!=NULL) {
Pág.116
Na função main(), em vez de:
while(c==*-argv[0])
O correto é:
while(c=*++argv[0])
e, em vez de:
nrlinha++1
O correto é:
nrlinha++;