Ir ao conteúdo

C strncpy não funciona com Array


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado

O Problema esta no strncpy ou no for?
ele não aceita a maneiira que eu escrevi o strncpy 
sobre o código ele vai ler um .txt que na primeira linha tem escrito pokemon  sendo que o for é pra organizar índice a índice

o progamia tem essa saída  mas nem roda o for 

image.png.14c203ed7d505cc8ce9728132bd23e2e.png

printf(" ---------------- Mano III ---------------- \n");
	ponteiro= fopen("02,1 Lendo Aquivos Textos A.txt","r");
	fgets(texto1,20, ponteiro);
	printf("%s",texto1);
    //  memcpy(texto3,texto1,strlen(texto1)-1* sizeof(char));
    strcpy(texto3, texto1);
    printf("texto3[0] = %s \n",&texto3[0]);
    printf("texto3[1] = %s \n",&texto3[1]);
    printf("texto3[2] = %s \n",&texto3[2]);
    printf("texto3[3] = %s \n",&texto3[3]);
    
    for( p=0; p<3; p++){
        // memcpy(texto4[p],texto3[p],sizeof(char));
        strncpy(texto4[p],texto3[p],2);
        printf("una letra = %s \n",&texto3[p]);
    };
    
    printf("%s",texto1);
	
	

	fclose(ponteiro); 

 

  • Obrigado 1
Postado

@Lucca Rodrigues completo

# include <stdio.h>
# include <stdlib.h>
# include <math.h>
# include <string.h>  //
int main (void) {
	/* */
	FILE *ponteiro;
	char texto1[20];
	char texto2[20];
	char texto3[20];
    char texto4[20];
	char hh[] ="pokemon"; 
	char hj[] ="Megaman";
	int p=0;
	
	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Abrindo e lendo com o r o texto
	// criar o nosso arquivo caso não tenha não � o foco 
	ponteiro= fopen("02,1 Lendo Aquivos Textos A.txt","w");
	fprintf(ponteiro, "%s \n" ,hh);
	fprintf(ponteiro, "%s \n" ,hj);
	fclose(ponteiro); // fechando
	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
	
	//  ------------------------------------- Mano III -----------------------------------------------------------
	// Mano II Ler e Gravar Um Array 
	
	printf(" ---------------- Mano III ---------------- \n");
	ponteiro= fopen("02,1 Lendo Aquivos Textos A.txt","r");
	fgets(texto1,20, ponteiro);
	printf("%s",texto1);
    //  memcpy(texto3,texto1,strlen(texto1)-1* sizeof(char));
    strcpy(texto3, texto1);
    printf("texto3[0] = %s \n",&texto3[0]);
    printf("texto3[1] = %s \n",&texto3[1]);
    printf("texto3[2] = %s \n",&texto3[2]);
    printf("texto3[3] = %s \n",&texto3[3]);
    
    for( p=0; p<3; p++){
        // memcpy(texto4[p],texto3[p],sizeof(char));
        strncpy(texto4[p],texto3[p],2);
        printf("una letra = %s \n",&texto3[p]);
    };
    
    printf("%s",texto1);
	
	

	fclose(ponteiro); 

	return(0);
}

 

  • Curtir 1
  • Solução
Postado

@IzeraXD isole o problema, observe os alerta na compilação.

[C]

#include"string.h"
#include"stdio.h"
int
main (void) {
  char texto4[120] = { "" };
  char texto3[120] = { "pokemon" }; // resultado pós-leitura do arquivo.
  unsigned long p;
  for (p = 0;  p < 3;  ++p) {
      strncpy (texto4[p], texto3[p], 2);
      printf ("uma letra = %s \n", &texto3[p]);
  }
  return 0;
} 

[compilador]

1969681827_Semttulo.png.27320dd4e4cd808d824c20f253918e2d.png

 

strncpy: (argumentos) Origem e Destinos são ponteiros.

[:)

  • Curtir 3
Postado

@mauro_b  o proposito do co código é pegar os dados do ponteiro file (txt)
nesse caso tem como ter alguma conversão ou forma de funcionar?
(é ate um errinho meu cada índice seria só uma letra  )
strncpy (texto4[p], texto3[p], 1);

eu quero isso tipo
 texto4[0] = p
 texto4[1] = o
 texto4[2] = k
 texto4[3] = e

@mauro_b  valeu man você facilitou pra eu encontra a solução
achei uma solução meio torta😂
inclui & no strncpy  na teria o certo seria * mas vai entender 
 

for( p=0; p<5; p++){

strncpy(&texto4[p],&texto3[p],1);

printf("una letra = %s \n",&texto4[p]);

};

  • Curtir 1
Postado

@IzeraXD Se postar enunciado fica mais fácil ajudar, mas já que esta fazendo o loop para mostrar as letras de cada posição da string não precisa de uma função para copiar. Você pode ir atribuindo cada letra de uma para a outra com base no índice/posição.

  • Obrigado 1
Postado

@Midori Antes de tudo muito provavelmente mesmo existe formas melhores de escrever esse código
na verdade esse código é para Ler dados  um aquivo txt e gravar num array e por isso atribuições simples não funcionaria por que todos os dados vem de  ponteiro 

e todos array se comportam como ponteiro o que gera muitos problemas  ooor exemplo esse é o resultado de um simples  strlen

image.png.c8933cbd4d7c7a6faed7b62b7c684f3d.png

o código que fiz ai meio que engana o que o ponteiro passa ate organizar uma array (texto4) indice a índice 
o ponteiro não me da organizado índice a indiice conforme a imagem do resultado

image.png.2bc77b68bec55bebcb8e207546994c74.png

ainda estou desenvolvendo esse código mas para aquivo txt a cada loop é uma linha pulada 

no final de  tudo quero chegar ao resultado vá ate a linha 5 no txt e leia  e grave numa variável
estou tendo probemas com algums detalhes que presiiso de ajuda e estou testando varias coisas

e futuramente vá ate a linha  5 e escreva isso que acho que vai ser bem mais fácil
 

mas sinceramente próximo ano eu termino presiiso de ajuda 🤣


fora que EM C  texto4[p] = texto3[p]; não funciona para string 

  • Amei 1
Postado

@IzeraXD    seu código está escrevendo palavras , e não caracteres , como você Quer   !  ,  pois você colocou o especificador de string's , da Linguagem  ,  Que é o "%s , e para caracteres é o "%c" ,  assim a palavra escrita vai diminuindo de tamanho ao deslocar a posição inicial dela , Quando você usa o "&" de endereço da VariáveL  ,  e seu código poderia também ser assim  :

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int strben(char*);
int          main ()
{
    FILE *ponteiro;
    char texto1[21];
    char texto2[21];
    char texto3[21];
    char texto4[21];
    char hh[] = "pokemon";
    char hj[] = "Megaman";
    int p = 0;
                                                            /// Abrindo e lendo com o r o texto
                                                            /// criar o nosso arquivo caso não tenha não eh o foco
    ponteiro = fopen("02,1 Lendo Aquivos Textos A.txt","r");/// tenta Abrir
    if(ponteiro == NULL)                                    /// se não conseguir
    {
        printf("errou !\n");
        ponteiro = fopen("02,1 Lendo Aquivos Textos A.txt","w"); /// cria abre e reseta o
                                                            /// arquivo p/ gravar desde o inicio dele
        fprintf(ponteiro, "%s\n" ,hh);                      /// porQue colocar espaco no final da linha ? ? ? !
        fprintf(ponteiro, "%s\n" ,hj);
    }
    fclose (ponteiro);                                      /// fechando
                                                            /// Mano III
                                                            /// Mano II Ler e Gravar Um Array
    printf(" ---------------- Mano III ---------------- \n");
    ponteiro = fopen("02,1 Lendo Aquivos Textos A.txt","r");
    fgets(texto1,20, ponteiro);                             /// + hum para o "\0" Finalizador de string's
    texto1[strben(texto1) - 1] = 0;
    printf("\n-> %s Tem %d Caracteres !\n",texto1,strben(texto1));
                                                            ///  memcpy(texto3,texto1,strlen(texto1)-1* sizeof(char));
    strcpy(texto3, texto1);
    printf("texto3[0] = %c\n", texto3[0]);
    printf("texto3[1] = %c\n", texto3[1]);
    printf("texto3[2] = %c\n", texto3[2]);
    printf("texto3[3] = %c\n", texto3[3]);
    printf("texto3[4] = %c\n", texto3[4]);
    printf("texto3[5] = %c\n", texto3[5]);
    printf("texto3[6] = %c\n", texto3[6]);
    for( p=0; p<3; p++)
    {
                                                            /// memcpy(texto4[p],texto3[p],sizeof(char));
        strncpy(texto4[p],texto3[p],2);
        printf("una letra = %c \n",&texto3[p]);
    }                                                       /// ; aqui
                                                            /// podE sim coLocar ponto_e_Virgula , porém não precisaaa
    printf("%s",texto1);
    fclose(ponteiro);
    return(0);
}
int strben(char A[])
{
    int tm = 1;         /// qtd de caract dessa strinG A
    while(A[tm] != 0 )  /// vai até o finalizador de string
    {
        tm++;           /// incrementa o total de caracteres
    }
    return tm;          /// retorna o total de caract
}

e se strlen dá problemas , então você pode usar essa função ""strben"  .

e o resultado seria esse aqui :

pokemon.thumb.jpg.7c6479806bba155cfa849ce81d968364.jpg

 

  • Curtir 1
  • Amei 1
Postado
7 horas atrás, IzeraXD disse:

Ler dados  um aquivo txt e gravar num array e por isso atribuições simples não funcionaria

Seu código lê o arquivo e copia o conteúdo para uma string (vetor de char), é isso que fez quando usou fgets. Portanto o dado lido do arquivo já está pronto para pode ser manipulado como qualquer string, inclusive como comentei que é pegando letra por letra sem a necessidade de uma função para isso, p.ex,

 

for(p = 0; texto3[p]; p += 1){
    texto4[p] = texto3[p];
    printf("Letra %c\n", texto4[p]);
}
texto4[p] = 0;
puts(texto4);

 

  • Curtir 1
  • Obrigado 1
Postado
10 horas atrás, IzeraXD disse:

na verdade esse código é para Ler dados  um aquivo txt e gravar num array e por isso atribuições simples não funcionaria por que todos os dados vem de  ponteiro 

e todos array se comportam como ponteiro o que gera muitos problemas  ooor exemplo esse é o resultado de um simples  strlen

 

poste texto e não imagens do código.

 

Não consigo entender o que tenta fazer. Qual o problema de strlen()? O que significa "todos array se comportam como ponteiro" e porque isso gera muitos problemas? Poderia dar um exemplo objetivo?  

 

Acessar arrays coo ponteiros é a razão de C ter chegado onde chegou. Base (endereço) e deslocamento é tudo que existe na memória e lá estão os tais arrays. 

 

Qual a razão de usar strncpy() em letras? 

 

Não use nunca strlen() num teste de saída de um for: é uma chamada de função. Vai ser chamada toda vez. E se  alterar a suposta string durante o loop pode afetar a saída do loop de um modo imprevisto.

 

Poste uma descrição mais formal do que está tentando fazer e fica mais fácil tentar te ajudar

  • Curtir 1
  • Obrigado 1
Postado
1 hora atrás, arfneto disse:

Não consigo entender o que tenta fazer. Qual o problema de strlen()? O que significa "todos array se comportam como ponteiro" e porque isso gera muitos problemas? Poderia dar um exemplo objetivo?  

eu mostrei a foto por que por o strlen esta devolvendo endereços de memoria como foi mostrado na imagem

strlen normalmente devolve o tamanho de uma array

eu pus & mas acredite estou testando de varias formas o dia inteiro
e & com ou sem & funciona do mesmo jeito tratando tudo como memoria

1 hora atrás, arfneto disse:

Acessar arrays coo ponteiros é a razão de C ter chegado onde chegou. Base (endereço) e deslocamento é tudo que existe na memória e lá estão os tais arrays. 

 eu falei que isso é um problema por que algumas pessoas estava sugerindo atribuições simples que não funciona para ponteiro de string , e eu tabem isso é um problema para min que não lido nada bem com ponteiros e as pessoas esquecem que isso é ponteiro e diz atribuição simples e acredite eu testei tudo que falaram varias vzs

 

mas independe te disso cada ideia importa e coisas que foi falada como %c vou usar no código ainda não usei por que eu estou vendo como %s no total da string se comporta  vou falaar disso na próxima resposta  

1 hora atrás, arfneto disse:

Qual a razão de usar strncpy() em letras? 

 

eu usei %s pra entender como os arrays estavam sendo gravados 

 

Em 07/02/2022 às 16:18, IzeraXD disse:
printf("texto3[0] = %s \n",&texto3[0]);

 

ele me deu esse resultado

image.png.a1a066b438f80e15c145c9d9d190828e.png

 

pela imagen da pra notar o comportamento |que não esta organizado indice a indice eu sei da pra por um %c e probema resolvido mas frescura minha mas acho uma variável como mostrada acima mal organizada e feia 🤣 e tabem fico com medo por que a evoluçao desse codigo é copia a linha 5 do txt 1 e grave na linha 10 do txt 2

ai se eu pedido grave essa string ai da foto no texto talvez grave todas essa caracteres repetidos 

 

1 hora atrás, arfneto disse:

Poste uma descrição mais formal do que está tentando fazer e fica mais fácil tentar te ajudar

ok

 

Em 07/02/2022 às 12:41, IzeraXD disse:

sobre o código ele vai ler um .txt que na primeira linha tem escrito pokemon  sendo que o for é pra organizar índice a índice

o progamia tem essa saída  mas nem roda o for 

mas me expliquei mal deveria ter falado organizar um array indice a indice mas achei que  o código deixava isso bem claro 

  • Curtir 1
Postado
21 minutos atrás, IzeraXD disse:

eu mostrei a foto por que por o strlen esta devolvendo endereços de memoria como foi mostrado na imagem

strlen normalmente devolve o tamanho de uma array

 

strlen() retorna size_t. Um inteiro sem sinal. Está no manual. Ela não tem escolha sobre o que retornar.

 

A lógica de strlen() é linear: a partir do endereço passado como parâmetro (base) conta a distância (deslocamento) até achar um 0 na memória

 

24 minutos atrás, IzeraXD disse:

eu pus & mas acredite estou testando de varias formas o dia inteiro
e & com ou sem & funciona do mesmo jeito tratando tudo como memoria

 

Você passou errado o parâmetro apenas. Onde está o código atual e o enunciado?

 

25 minutos atrás, IzeraXD disse:

pela imagen da pra notar o comportamento |que não esta organizado indice a indice eu sei da pra por um %c e probema resolvido mas frescura minha mas acho uma variável como mostrada acima mal organizada e feia

 

variáveis são só isso: coisas que variam. E tem um tipo. Não são feias. Se a organização não está boa use struct. Serve para isso.

 

27 minutos atrás, IzeraXD disse:

mas me expliquei mal deveria ter falado organizar um array indice a indice mas achei que  o código deixava isso bem claro 

 

não consigo entender.

 

Um array é por definição uma base e um deslocamento. O tal índice é o deslocamento. E C é a melhor linguagem para isso. Foi escrita para isso nos '70 para não ter que escrever um sistema inteiro em Assembler e sem perder muito em desempenho. Então em C manipular endereços e memória é rápido e simples. E como arquivos também são vistos assim em C (endereços) é trivial tratar tais arquivos. E como no Unix --- o primeiro sistema escrito a partir de C --- tudo é um arquivo, como memória e processos e dispositivos, tudo em C é uniforme na hora de tratar. E rápido. E como Windows foi escrito assim e Linux é Unix e MacOS é Linux e o Android é Linux dá pra imaginar o papel dessa linguagem no desenvolvimento de sistemas...

 

Poste o código como está e o que está tentando fazer e eu te mostro uma maneira comum de escrever. Ou umas.

 

 

 

 

  • Obrigado 1
Postado

pra o problema  que eu propus no tópico foi resolvido muito la em cima
esse problema que estou tendo agora é outro é definir ate onde vai ser gravada a array

como o codigo do @arfneto que estou estudando e tentando aplicar no meu código

 

meu probema é ate bem simples na vdd todo programador sabe que definir um numero definido para a repetição do for é sempre algo temporário
 

 for( p=0;p<=6; p++ ){
        strncpy(&texto4[p],&texto3[p],1);
        printf("una letra = %s \n",&texto4[p]);
      //  texto3[p] = NULL;
       // printf("una letra = %s \n",&texto3[p]);
    };

estou tentando arrumar uma forma de  tirar esse pv<=6  e dizer faza isso ate que a "'ponteiro"/array 3 acabe tudo que tem escrito que são letras não valores de memoria já tentei de varias formas
texto3[p]=\n // se lembrem que ´e um arquivo texto 
strlen(texto3);

e outras

// sizeof(texto3[1])

// fgets(texto1,20, ponteiro);

//(fgets(texto1,20, ponteiro) != NULL)                        *texto3[p] == "\n"

//uzz(&texto3[p],p)== 0                p<=6

//"\n"==strcmp(&texto3[p],&texto1[p]);

// *(&texto3[p])

// 0==strcmp(texto3[p],'\n')

// texto3[p]=\n

 

eu vou postar o código por que facilita muito essa é uma versão resumida do código vou postar abaixo a versão completa que funciona mas com o probema dito acima  tabem

[]

versão resumidaa

# include <stdio.h>
# include <stdlib.h>
# include <math.h>
# include <string.h>  
/* */
// Variaveis
FILE *ponteiro;
char texto1[20]; // Varivael Goblal
char texto2[20];
char texto3[20]; // mano IV organizado
char texto4[20]; // mano IV organizado
//int texto5[20];
char texto5[20]; // mano V na vdd é só tamanho
char texto6[20]; // mano V na vdd é só tamanho
char hh[] ="pokemon"; 
char hj[] ="Megaman";
char hjf[] ="Megamente";
char hjfg[] ="Kyrbi";
int p=0,pj=0; // juju contador do mano III p contador do mano IV 
int juju=0;
int *yzz;
char azz;
/* 
int uzz(){
  yzz = strcmp(&texto3[p],"\n");
	return yzz;
}
    */
int strben(char*);

int strben(char A[]) {
    int tm = 1;         /// qtd de caract dessa strinG A
    while(A [tm] != 0 ){  /// vai até o finalizador de string
        tm++;           /// incrementa o total de caracteres
    }
    return tm;          /// retorna o total de caract
}    

int main () {
	
	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Abrindo e lendo com o r o texto
	// iginoreeeeeeeeeeeeeeeeeeeeeeem a marcao de X !!!!!!!!!!! isso  não importaa so grava os nomes no txt e cria o txt
	// criar o nosso arquivo caso não tenha não e! o foco 
	ponteiro= fopen("02,1 Lendo Aquivos Textos A.txt","w");
	fprintf(ponteiro, "%s \n" ,hh);
	fprintf(ponteiro, "%s \n" ,hj);
	fprintf(ponteiro, "%s \n" ,hjf);
	fprintf(ponteiro, "%s \n" ,hjfg);
	fclose(ponteiro); // fechando
	// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
	printf(" O Proposito desse programa é Ler  As Linha do Arquivo TxT e Gravalas em Variaveis  \n ");
	printf(" assim que você rodou crio o Arquivo Texto no diretorio . §referencia Temos   \n  ");
	printf(" 0 Linha = Pokemon | 1 Linha = Megaman | 2 Linha = Megaman| 3 Linha = Megaman |  \n ");
	
	//  ------------------------------------- Mano I -----------------------------------------------------------
	// Mano III ( Copia\Ler UMA LINHA !!! )  e ( Gravar NUm Array  !!! ) 
	
	printf(" ---------------- Mano I ---------------- \n");
	ponteiro = fopen("02,1 Lendo Aquivos Textos A.txt","r");
	
	fgets(texto1,20, ponteiro);
	printf("A primeira Linha e! = %s \n ",texto1);
	texto1[strben(texto1) - 1] = 0;
	printf("A primeira Linha e! =  \n ");
	//strben(texto1
	fclose(ponteiro); 
	fflush(ponteiro);
	printf("Limpando  Tudo \n ");
	for( p=0; p<6  ; p++){
       texto1[p] = 0;
	   texto3[p] = 0;
	   texto4[p] = 0;
		printf(" %s .",&texto4[p]); 
    };


	//  ------------------------------------- Mano IV -----------------------------------------------------------
	// Mano III ( Ler UMA LINHA !!! )  e ( Gravar NUm Array Organizado !!! )   txt 4 organizado indice a indice
	// fflush(ponteiro);
	printf(" \n ---------------- Mano IV ---------------- \n");
	ponteiro = fopen("02,1 Lendo Aquivos Textos A.txt","r");
	scanf("%*c");
	fgets(texto1,20, ponteiro);
	printf("%s",texto1);
    strcpy(texto3, texto1);
    texto5[strben(texto3) - 1] = 0;
    printf("texto3[0] = %s ",&texto3[0]);
    printf("texto3[1] = %s ",&texto3[1]);
    printf("texto3[2] = %s ",&texto3[2]);
    printf("texto3[3] = %s ",&texto3[3]);

    for( p=0; p<=6 ; p++ ){
        strncpy(&texto4[p],&texto3[p],1);
        printf("una letra = %s \n",&texto4[p]);
      //  texto3[p] = NULL;
       // printf("una letra = %s \n",&texto3[p]);
    };
	fclose(ponteiro); 
	fflush(ponteiro);
	
	printf("Limpando  Tudo \n ");
	for( p=0; p<6  ; p++){
       texto1[p] = 0;
	   texto3[p] = 0;
	   texto4[p] = 0;
		printf(" %s .",&texto4[p]); 
    };
	


	//  ------------------------------------- Mano Fim -----------------------------------------------------------
	return(0);
}


 

vou postar o código completo como zip ele funciona o de cima não 

porém com os erros citados 
peço que não deem atenção a esse arqivo a grande quantidade de informaçoes so vai bugar a discussão
peço cada mano é uma proposta difente 

se você quiserem baixa pra roda testem porém tem oo erro citado acima

02 Lendo Aquivos Textos zip .c.zip

20 minutos atrás, arfneto disse:

A lógica de strlen() é linear: a partir do endereço passado como parâmetro (base) conta a distância (deslocamento) até achar um 0 na memória

 

o que eu queria era parar no \n
( tive que tirar fotoo porque essa tela some)
image.thumb.png.c25273b06b640ec9c39b2617e1eb9b49.png 

se eu tratar como um array simples não funciona por uma imagen postado antes da pra ver o text3[0];

nele esta todo escrito pokemon

image.png.a4ce2604ef097aa6d3e8080ab54bdb3a.png

o que eu falei que esses arrays se comportam como ponteiro

image.thumb.png.396ee4546851321d9bcf9dbf381645fb.png

e sobre "\n";n ele não recuosou porém não quer rodar nada do for geralmente ele escreveria letra a letra pokemon

image.png.6cb558b56133163cf56d64c089fa0c38.png

image.png

38 minutos atrás, IzeraXD disse:

o que eu queria era parar no \n

o forum juntou meus comentarios (tudo bem) mas ficou um pouuco mal organizado da minha parte 

41 minutos atrás, arfneto disse:

Você passou errado o parâmetro apenas. Onde está o código atual e o enunciado?

eu postei ai te respondendo mas esqueci de  te marca 

  • Amei 1
Postado

Poste o enunciado (o que você esta tentando fazer) para ficar mais fácil de entender.

 

Porque pra mim o que você está fazendo é só complicar o que parece fácil.

  • Obrigado 1
Postado
28 minutos atrás, kgin disse:

Poste o enunciado (o que você esta tentando fazer) para ficar mais fácil de entender.

 

Porque pra mim o que você está fazendo é só complicar o que parece fácil.

oiiiiiiiiiiiii 
Aquiiiiiiiiiiiiii
TODO O Primeiro palagrafo é sobre o probema 

4 horas atrás, IzeraXD disse:

pra o problema  que eu propus no tópico foi resolvido muito la em cima
esse problema que estou tendo agora é outro é definir ate onde vai ser gravada a array

como o código do @arfneto que estou estudando e tentando aplicar no meu código

 

esqueça o código foque no for comparar um PONTEIRO!!!!!
 

4 horas atrás, IzeraXD disse:

o que eu queria era parar no \n

não leia como se eu estivese gritando eu admito não ter capacidade de resolver esse programa sozinho 

Leia aparti daqui é cheio de imagens   o que só importa é o for e repetindo é um ponteiro olhe as imagens comparações simples não dao certo 
falando serio se alguém posta tenta compara assim eu fico muito feliz
  

simples não da certo 

 

 

isso aqui rodo 
for( p=0; *(&texto3[p]) != '\n' ; p++ )
obrigado a todos ❤️ ❤️ ❤️ ❤️ 

vou deixar o código aqui pra  quem quiser testar 
ele cria um txt pega a linha do TXT e grava numa variável 

// desculpe  a bagunça no código

vou tentar aplicar os conceitos que vocês falaram tabem ❤️ 

@arfneto @devair1010
desculpe a dor cabeça que di a vcs 
amanha começo a escrever um que grava num  texto ai chamo vcs no zap🤣

02 Lendo Aquivos Textos.c.zip

  • Obrigado 1
Postado

@IzeraXD Seria isso que você está tentando fazer?

            /* Copia a string para uma array */
    printf("Mostra o nome letra por letra\n");
    for (contador1 = 0; texto[0][contador1] != '\n' && texto[0][contador1] != '\0'; contador1++) {
        personagem[contador1] = texto[0][contador1];
        printf("%c ", personagem[contador1]);
    }
    /* Coloca o sinalizador de final da string */
    personagem[contador1] = '\0';

código fonte completo

codigo_fonte.zip

  • Curtir 1
Postado

@IzeraXD Eu ainda não entendi claramente o que o seu programa tem que fazer.

6 minutos atrás, IzeraXD disse:

se lembre que os dados dos nomes vem do aquivo txt não de um array

era só um exemplo, você tem que carregar os nomes em algum lugar temporário que foi isso que eu fiz.

arquivos texto (ou não binários) tem o acesso sequencial, significa que você não pode ir em X linha sem ler o arquivo todo, que foi isso que eu fiz.

  • Curtir 1
Postado
23 minutos atrás, kgin disse:

arquivos texto (ou não binários) tem o acesso sequencial, significa que você não pode ir em X linha

exatamente isso que meu programa faz MAS sim ele ler o aquivo todo ate chegar a uma Liinha no Final
esse aquivo te passei faz isso O mano V | Os Outros Manos Sao outros jeitos por exemplo só copia a primeira linha Na vdd todos os outros mano é pra construir o conceito do mano V
va ate a linha 4 copia a palavra kirbi cole num arrayy organize esse array e grave esse array em outro txt
essa   de gravar eu ainda não fiz kkk mas vamo na paciencia gentte ❤️ 

  • Obrigado 1
Postado

@kgin    o enunciado é essa aqui 

1 - definição do problemas
segundo o dicionáeio Michaelis de língua Portuguesa , a palavra palíndromo possui a definição a seguir:
----------------------------------------------------------------------------------------------------------
Palíndromo
pa♥lín♥dro♥mo
adj sm
Diz-se de palavra ou verso ou frase que pode ser lido tanto da esquerda para a direita como da direita 
para a esquerda sem alteração do sentido .
----------------------------------------------------------------------------------------------------------
Uma palavra palíndroma é , portanto , aquela cuja sequência  de letras é simétrica , permitindo leitura idêntica
da esquerda para a direita ou da direita para a esquerda .   Exemplos : aia , aibofobia , ala , ama , anilina , ata , 
arara , asa , ele , esse , mamam , matam , metem , mirim , oco , osso , ovo , entre muitas outras . 
----------------------------------------------------------------------------------------------------------
O objetivo é construir um programa que informa ao usuário se a palavra digitada por ele é palíndroma ou não .
----------------------------------------------------------------------------------------------------------
2 - Regras
1 . A biblioteca padrão da linguagem C para manipulação de strings ( strinh.h ) não poderá ser utilizada ! 
( Códigos cuja implementação possuírem funções da string.h não serão consideradas ) .

Introdução à Computação(CMA11381C-111T) - Exercício Computacional #1                                     2
----------------------------------------------------------------------------------------------------------
A ideia deste curso é ensiná-los , acima de tudo , desenvolver habilidades lógicas para escrever algorítmos 
e programa , independentemente de linguagem . Neste caso , ela é apenas meio e não fim)
2 . Devem ser consideradas apenas palavras de até 15 caracteres maiúscula e/ou minúsculas .
Se o usuário entrar com uma cadeia contendo mais do que 15 caracteres , esta entrada deverá ser considerada 
inválida pelo programa , bem como :
• palavras compostas;
• strings com números;
• strings com caracteres especiais;
• strings com espaços e tabs;
• strings com apenas espaços , tabs ou , até mesmo , vazias (usuário apertando apenas a tecla enter).
Enquanto não estiver correta , o programa deverá continuar solicitando nova entrada . Lembre-se :
o bom desenvolvedor sempre pensa em todas as possíveis ações do usuário .  Palavras acentuadas ,
mesmo que palíndromas (por exemplo , omissíssimo) , deverão também ser consideradas entradas inválidas .
----------------------------------------------------------------------------------------------------------
Exemplos (Entradas Válidas): Sopapos , reviver , REVIVER , Reviver , ASA , Asa ,aSa ,asA , asa , osso . 
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
Exemplos (Entradas Inválidas): 2002 , 4004 ,ProFGalenO ,ProFAL!via , L@cost@ , otorrinolaringologista , 
CisBetterThanPython! , &%$#$ .
----------------------------------------------------------------------------------------------------------
3 . Cuidado ! A linguagem C é case sensitive , isto é , faz distinção entre letras maiúsculas e minúsculas . 
Portanto , do ponto de vista do C , palavras palíndromas como , por exemplo , Asa = asa = ASA =aSa podem ser 
consideradas não-palíndromas se a comparação de chars não for feita de forma logicamente correta .

Introdução à Computação(CMA11381C-111T) - Exercício Computacional #1                                     3
----------------------------------------------------------------------------------------------------------
4 . Arquivos
                    palin.c
palin.c é o arquivo que deverá conter o código fonte implementado . Ele não está vazio .  Já contém um modelo 
de implementação a ser seguido , conforma explicação a seguir .

#define MAX_SIZE 250
#define MAX_SIZE_WORD 16

MAX_SIZE é a constante que define o número máximo de posições alocadas estaticamente na memória para as strings 
declaradas no programa .  MAX_SIZE_WORD é a contante que define o tamanho máximo das entradas permitidas , dadas 
pelo usuário :  15 caracteres juntamente com o espaço reservado para o '\0' .

           0   1   2   3   ...   14      15
-----------------------------------------------
| string | 1 | 2 | 3 | 4 | ... | 15 | 16:'\0' |
-----------------------------------------------
Figura 1 . Lembre-se :  em linguagem C , uma string é um vetor de caracteres cuja última posição é destinada ao '\0'
que indica seu final . Observe então que uma string possuíndo 15 caracteres tem 16 posições de memória cujos endereços
vão de 0 a 15 , tal que sua décima sexta posição é destinada ao '\0' .
int c;
int flag;
char str[MAX_SIZE];
int c é uma variável inteira definida para auxiliar na leitura da entrada dada pelo usuário .
int flag é uma variável inteira bandeira e funcionará como uma sinalizadora ( de comportamento booleano ) no programa .
char str[MAX_SIZE] é a string que receberá(armazenará) a entrada do usuário .
flag = 0;
do
{
    scanf("%50[^\n]" , str);
    while*((c = getchar()) != '\n' ** c != EOF){}

    /*<...>*/

}while (flag == 0);

Introdução à Computação(CMA11381C-111T) - Exercício Computacional #1                                     4
----------------------------------------------------------------------------------------------------------
A variável flag é inicializada com zero . O comando scanf("%50[^\n]" , str)  juntamente com a linha do while
compõem a leitura da string entrada pelo usuário através do teclado .  Sob hipótese alguma , delete ou faça alguma alteração
destes dois comandos ! Todo tratamento de entradas incorretas (descritas nas regras acima) deve ser feito no trecho /*<...>*/ .
A ideia é que enquanto o usuário não  entre com a entrada correta ( conforme as regras )  , o computador solicite nova leitura 
( por esta razão , este trecho de código está dentro do do-while ) .   A variável responsável por fazer o laço parar quando a 
entrada lida for correta é flag .  Portanto , é necessário fazer flag = 1 ( não esquecer seu caráter booleano ) quando a 
entrada for correta .
 
Recmenda-se fortemente não compilar palin.c sem prévia alteração , pois o programa entrará em loop infinito dado que , em 
nenhum momento , a variável flag muda de valor fentro do loop .   O espaço destinado à implementação do objetivo do exercício 
está logo após o loop , como está comentado no arquivo palin.c 

                       Input.txt
O arquivo Input.txt contém as entradas que deverão ser testadas pelo programa .

                       Output.txt
Para a correção dos resultados obtidos pelos programas , as saídas deverão ser salvas em um arquivo de texto ( Output.txt )
tal que cada linha do arquivo deve conter a resposta correspondente a sua respectiva entrada .  O retorno obrigatório do 
programa é -1 para entrada incorreta , 1 para palavra palíndroma e  0 para palavra não-palíndroma .

Boa sorte !
                     REFERÊNCIAS
[1] http//michaelis.uol.com.br/moderno~portugues/busca/portugues~brasileiro/pal%C3%ADndromo/.

Postado
5 horas atrás, IzeraXD disse:

como o codigo do @arfneto que estou estudando e tentando aplicar no meu código

 

Qual código seria esse que está tentando aplicar aqui?

 

25 minutos atrás, kgin disse:

arquivos texto (ou não binários) tem o acesso sequencial, significa que você não pode ir em X linha sem ler o arquivo todo, que foi isso que eu fiz.

 

Não existe "arquivo txt" e nem essa restrição de não poder ir para a linha X. Arquivos txt não são organizados em linhas. Apenas as funções que operam com esses arquivos procuram por delimitadores de linha, os '\n'. A gente lê assim. Mas o arquivo não conhece isso. Nem a linguagem.

 

O que define se você pode ir adiante ou para trás no arquivo é o modo de abertura, o segundo parâmetro do fopen(). E o deslocamento, não por acaso, não é em linhas mas sim em bytes, e você muda a posição chamando fseek() e descobre onde está chamando ftell().

 

1 hora atrás, IzeraXD disse:

for( p=0; *(&texto3[p]) != '\n' ; p++ )

 

Não escreva assim. Declare as variáveis de controle NO LOOP.

 

  yzz = strcmp(&texto3[p],"\n");

 

Essa linha está comentada em seu programa original, @IzeraXD

 

Note que "\n" é uma string e tem dois bytes, 0x0A ou 10 e 0

 

e '\n' é uma letra, um char, e vale 10 na tabela

 

1 hora atrás, IzeraXD disse:

pra o problema  que eu propus no tópico foi resolvido muito la em cima
esse problema que estou tendo agora é outro é definir ate onde vai ser gravada a array

como o código do @arfneto que estou estudando e tentando aplicar no meu código

 

Se tem outro problema abra outro tópico com um título que ajude outros que tenham interesse no problema a acharem o tópico

 

// Variaveis
FILE *ponteiro;
char texto1[20]; // Varivael Goblal
char texto2[20];
char texto3[20]; 
char texto4[20]; // mano IV organizado
char texto5[20]; // mano V na vdd é só tamanho
char texto6[20]; // mano V na vdd é só tamanho
char hh[] ="pokemon"; 
char hj[] ="Megaman";
char hjf[] ="Megamente";
char hjfg[] ="Kyrbi";
int p=0,pj=0; // juju contador do mano III p contador do mano IV 

 

Isso vem de seu programa também.

 

Não escreva assim. 

 

Não declare variáveis fora de main. É um desastre e proibido em toda parte

 

Evite esse tido de comentário: //Variáveis dá pra imaginar que são variáveis

 

em C você declara variáveis com um nome e um tipo. 

 

fopen retorna FILE* um ponteiro para FILE que é uma estrutura do sistema.

 

Pois é: de seu código:

 

	ponteiro= fopen("02,1 Lendo Aquivos Textos A.txt","w");

 

Veja uma alternativa:
 

char*		modo = "w";
char*		nome = "02,1 Lendo Aquivos Textos A.txt";
FILE*		arq  = fopen( arquivo, modo );

 

É mais simples e seguro. E fácil de ler. arq só passa a existir depois do fopen. No seu caso ela vale no programa todinho.

 

E não é boa ideia chamar um arquivo de ponteiro. Só vai confundir você e quem ler isso.

 

O que quer com essas variáveis texto1 a testo6 ? E se fossem 600?

 

Prefira

 

	char		texto[6][20];

 

Não use fflush() na entrada. Nem existe isso. Não use fflush() no geral a menos de uma razão séria como zerar um buffer de transmissão ou forçar a gravação de uma linha.

 

 

 

 

  • Curtir 1
  • Amei 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!