Gabriel Lemos Posted December 1, 2020 at 06:41 PM Share Posted December 1, 2020 at 06:41 PM meu codigo pega apenas uma string de um arquivo e passa para outro arquivo invertida mas n pega varias strings de um arquivo separadas por \n e tambem deve usar aritmetica de ponteiros para manipular os vetores. ALguem pode ajudar? #include<stdio.h> #include<string.h> #include<stdlib.h> void verifica (char txt[200], char aux[200], int b, char txt_orig[200]); void criptografar(char txt[200],int b); int main(){ char txt[200],aux[200], txt_orig[200]; int a,b; FILE *arqp, *arqp2; arqp = fopen("arqp.txt","r"); if (arqp==NULL){ printf("Deu erro"); system("pause"); exit(1); } arqp2 = fopen("arqp2.txt", "w+"); printf("String original: "); while(!feof(arqp)){ fgets(txt,200,arqp); b=strlen(txt); puts(txt); strcpy(txt_orig, txt); criptografar(txt,b); //fputs(arqp2,txt); } char* txt_novo = txt + 1; printf("\nString criptografada: %s", txt_novo); verifica(txt,aux,b,txt_orig); fclose(arqp); fclose(arqp2); } void criptografar(char txt[200],int b){ char txaux; int i; for(i=0;i<b;i++){ txaux=txt[i]; txt[i]=txt[b]; txt[b]=txaux; b--; } } void verifica (char txt[200], char aux[200], int b, char txt_orig[200]){ int i; printf("\nString verificada: "); for(i=0;i<=b;i++){ aux[i]=txt[i]; txt[i]=txt[b]; txt[b]=aux[i]; b--; } printf("%s",txt); if (strcmp(txt_orig, txt) == 0) printf("\nAs frases estão iguais\n"); else printf("\nAs frases estão diferentes\n"); }> Link to comment Share on other sites More sharing options...
fredericopissarra Posted December 2, 2020 at 10:36 AM Share Posted December 2, 2020 at 10:36 AM #include <stdio.h> #include <string.h> #include <stdlib.h> void verifica ( char txt[200], char aux[200], int b, char txt_orig[200] ); void criptografar ( char txt[200], int b ); int main() { char txt[200], aux[200], txt_orig[200]; int a, b; // FIXME: Onde é que esse 'a' é usado? FILE *arqp, *arqp2; arqp = fopen ( "arqp.txt", "r" ); if ( arqp == NULL ) { printf ( "Deu erro" ); system ( "pause" ); // FIXME: Não use system()! exit ( 1 ); } // FIXME: O arquivo de saída também pode não conseguir ser aberto! // Onde está o teste? // Aliás, você não o está usando abaixo! arqp2 = fopen ( "arqp2.txt", "w+" ); printf ( "String original: " ); // FIXME: feof() não faz o que você pensa que ele faz. // feof() retorna um flag setado no stream DEPOIS // que uma operação de leitura é feita! while ( !feof ( arqp ) ) { // FIXME: fgets() também pode falhar! // Ainda: Uma linha pode ter mais que 200 chars... fgets ( txt, 200, arqp ); // FIXME: Uma linha lida de um arquivo termina com '\n' (exceto, // talvez, a última linha - se não terminar com '\n'). // Isso está certo? b = strlen ( txt ); // FIXME: puts() sempre imprime um '\n' extra. puts ( txt ); strcpy ( txt_orig, txt ); criptografar ( txt, b ); // FIXME: Não era para gravar no outro arquivo? //fputs(arqp2,txt); } // FIXME: Porque à partir do 2º caracter? char *txt_novo = txt + 1; printf ( "\nString criptografada: %s", txt_novo ); verifica ( txt, aux, b, txt_orig ); fclose ( arqp ); fclose ( arqp2 ); } void criptografar ( char txt[200], int b ) { char txaux; int i; // FIXME: Note que b é o tamanho da string. // Na primeira iteração o '\0' final da string é // copiado no primeiro char do buffer. for ( i = 0; i < b; i++ ) { txaux = txt[i]; txt[i] = txt[b]; txt[b] = txaux; b--; } } void verifica ( char txt[200], char aux[200], int b, char txt_orig[200] ) { int i; printf ( "\nString verificada: " ); // FIXME: O mesmo problema acima. for ( i = 0; i <= b; i++ ) { aux[i] = txt[i]; txt[i] = txt[b]; txt[b] = aux[i]; b--; } printf ( "%s", txt ); if ( strcmp ( txt_orig, txt ) == 0 ) printf ( "\nAs frases estão iguais\n" ); else printf ( "\nAs frases estão diferentes\n" ); } Link to comment Share on other sites More sharing options...
Gabriel Lemos Posted December 2, 2020 at 05:18 PM Author Share Posted December 2, 2020 at 05:18 PM Boa tarde. variavel a não precisou ser usada. É que a primeira questão pedia para inverter uma string criando uma função que faz isso e outra que verifica. Na segunda atividade é pra pegarmos isso de um arquivo e inverter e mandar pra outro. Só que poderá ser feito com mais de uma linha no arquivo(nessa logica que não consigo chegar) e um dos criterios é usar aritmetica de ponteiros. O segundo arq deveria ser criado, rodou certo no meu. O primeiro eu criei manualmente e joguei pra pasta onde estava o codigo acima. Esse meu código funciona para uma linha ou mais se não tiver \n porem não sei a logica para mais de uma linha separada por \n 6 horas atrás, fredericopissarra disse: #include <stdio.h> #include <string.h> #include <stdlib.h> void verifica ( char txt[200], char aux[200], int b, char txt_orig[200] ); void criptografar ( char txt[200], int b ); int main() { char txt[200], aux[200], txt_orig[200]; int a, b; // FIXME: Onde é que esse 'a' é usado? FILE *arqp, *arqp2; arqp = fopen ( "arqp.txt", "r" ); if ( arqp == NULL ) { printf ( "Deu erro" ); system ( "pause" ); // FIXME: Não use system()! exit ( 1 ); } // FIXME: O arquivo de saída também pode não conseguir ser aberto! // Onde está o teste? // Aliás, você não o está usando abaixo! arqp2 = fopen ( "arqp2.txt", "w+" ); printf ( "String original: " ); // FIXME: feof() não faz o que você pensa que ele faz. // feof() retorna um flag setado no stream DEPOIS // que uma operação de leitura é feita! while ( !feof ( arqp ) ) { // FIXME: fgets() também pode falhar! // Ainda: Uma linha pode ter mais que 200 chars... fgets ( txt, 200, arqp ); // FIXME: Uma linha lida de um arquivo termina com '\n' (exceto, // talvez, a última linha - se não terminar com '\n'). // Isso está certo? b = strlen ( txt ); // FIXME: puts() sempre imprime um '\n' extra. puts ( txt ); strcpy ( txt_orig, txt ); criptografar ( txt, b ); // FIXME: Não era para gravar no outro arquivo? //fputs(arqp2,txt); } // FIXME: Porque à partir do 2º caracter? char *txt_novo = txt + 1; printf ( "\nString criptografada: %s", txt_novo ); verifica ( txt, aux, b, txt_orig ); fclose ( arqp ); fclose ( arqp2 ); } void criptografar ( char txt[200], int b ) { char txaux; int i; // FIXME: Note que b é o tamanho da string. // Na primeira iteração o '\0' final da string é // copiado no primeiro char do buffer. for ( i = 0; i < b; i++ ) { txaux = txt[i]; txt[i] = txt[b]; txt[b] = txaux; b--; } } void verifica ( char txt[200], char aux[200], int b, char txt_orig[200] ) { int i; printf ( "\nString verificada: " ); // FIXME: O mesmo problema acima. for ( i = 0; i <= b; i++ ) { aux[i] = txt[i]; txt[i] = txt[b]; txt[b] = aux[i]; b--; } printf ( "%s", txt ); if ( strcmp ( txt_orig, txt ) == 0 ) printf ( "\nAs frases estão iguais\n" ); else printf ( "\nAs frases estão diferentes\n" ); } Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.