====== Errata ====== 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 ==== Na primeira linha temos: c-getchar(); O correto é: c=getchar(); ==== item 1.5.2 ==== Neste, a mudança vai ser sutil e possivelmente você nao 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 ==== No final da página, última linha: No lugar de **}** Deve ser escrito: **{** ==== item 1.9 ==== 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 ==== 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 ==== Na linha 11, temos: float eps = 1.0e = 5; O correto é: float eps = 1.0e-5; ==== item 2.5 ==== 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 ==== No meio da página temos na função comprime(char s[],int c): int o,j; O correto é: int i,j; 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 ==== 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< falta fechar um parêntesis. Deve ser: return (x>>(p+1-n))&~(~0< ==== Item 2.10 ==== No meio da página, temos: x=x*(y+2) O correto é: x=x*(y+1) ==== Item 2.12 ==== 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 ==== Na última linha, antes do final o item, temos: expressão como "z-a;" é... O correto é: expressão como "z=a;" é... ==== Item 3.3 ==== No programa //pesqbin()//, na linha if (x O correto é (erro do original em inglês): if (x ==== Item 3.5 ==== **Exercício 3-3** na segunda linha temos:\\ como a**=**z na cadeia... O corrreto é:\\ como a**-**z na cadeia... ==== Item 3.6 ==== N função //itoa//: do } /* gera digitos em ordem invrtida */ O correto é: do { /* gera digitos em ordem invrtida */ ==== Item 3.7 ==== 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 ==== 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 ==== Na última frase do primeiro parágrafo, temos:\\ A biblioteca-padrão inclui uma função atof; o arquivo cabeçalho **** a declara. O correto é:\\ A biblioteca-padrão inclui uma função atof; o arquivo cabeçalho **** 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'); Depois do meio da página, temos a expressão: sum += atof(linha) O correto é: soma += atof(linha) ==== Item 4.3 ==== No programa temos: #include /* para atof() */ O correto é: #include /* para atof() */ falta fechar a função //ungetch(int c)// com **}** ==== Item 4.4 ==== 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 ==== No cabeçalho dos blocos, substituir o segundo **obtemop.c** por **getch.c** ==== Item 4.9 ==== Na primeira linha da página: variáveis automáticas também são inicializadas com zero. Apenas as variáveis em registrados têm valor indefinido ==== Item 4.10 ==== No programa qsort, após a linha: ultimo = esq; inserir:\\ for (i=esq+1; i<=dir; i++) ==== Item 4.11,2 ==== O correto, no meio da página é:\\ //a macro é expandida para// printf("x/y""=%g\n",x/y); ===== Cap 5 ===== ==== Item 5.4 ==== Na quarta linha correto é:\\ **p-s** e não p+s. ==== Item 5.5 ==== Na segunda linha, de cima para baixo, o correto é:\\ **t++;** e mais nada. nos dois strcpy, faltou o ; depois do while:\\ while ((*s++ = *t++) != '\0')\\ ; Na função strcmp, o correto é:\\ if(*s=='0'). Na linha que começa com "Desde que", o correto é "operadores". Está escrito "operados"\\ No exercício 5-3 o correto é **strcat** (está escrito stract) \\ ==== Item 5.6 ==== Na penúltima linha, o correto é:\\ **linha[tam-1]='\0';** (falta abrir aspas simples). Na função qsort, o correto é:\\ **qsort(v,esq,ultimo-1);** (ultimo em vez de //ult//). ==== Item 5.7 ==== 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)** 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 ==== No primeiro parágrafo do item, linha 9, o correto é:\\ //20xlinha+col é usado para encontrar o elemento a[linha**][**col]//. ==== Item 5.10 ==== No primeiro e no segundo ecoa do item, em vez de:\\ //printf("%s%s",argv[i],(i1)?"%s":"%s",*++argv);//\\ o correto é:\\ //prin**t**f((argv>1)?**"%s "**:"%s",*++argv);//\\ Na função main, o correto é:\\ //while(lelinha(linha,MAXLIN**)**>0)//\\ e\\ // if(strstr(linha,argv[1]**)**!=NULL) {//\\ 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++**;**//\\ ===== Cap 6 =====