Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/03/2010, à 13:56

linkof789

probleme C

Bonjour.

Je suis en train de développer mon 1er programme en C(en mode texte).
J'ai des problème pour les code.
Quand je l'exécute il y a mon menu qui apparer  est j'écris 1(pour sélectionné mon action) donc normalement sa passe a la fonction mais le problème sois sa me met erreur de fragmentation ou sa m'affiche le menu.
je vous donne les code(je programme avec MonoDevlop) :

// project created on 06/03/2010 at 14:11
#include <stdio.h>
#include <stdlib.h>
#include "tatata.h"

int main (int argc, char *argv[])
{
	int menuid;
	int con = 1;
	
	while (con)
	{
		printf("==== Dev&w ====\n\n");
		printf("1. Nouveau ficher C/C++\n");
		printf("2. Nouveau ficher vide\n");
		printf("3. Aide\n");
		printf("4. Quiter\n\n");
		scanf("%d", &menuid);
		
		printf("\n");
		
		switch (menuid)
		{
			case 1:
				nfc();
				break;
			case 2:
				printf("En construction!!!\n");;
				break;
			case 3:
				printf("Pour faire une tabulation ecriver \\t.\nPour faire un retour a la ligne ecriver \\n.\n");
				break;
			case 4:
				con = 0;
				break;
			default:
				printf("\n");
				break;
		}
	
		return 0;
	}
}

pour le fichier main.c

void nfc()
{
	FILE* fichier = NULL;
	char name = " ";
	char script = " ";
	printf("Le nom du fichier :\n");
	scanf("%c", &name);
	printf("Le script du fichier :\n");
	scanf("%c", &name);
	fichier = fopen(name, "r+");
	
	if (name != "*.c")
	{
		name = name + "*.c";
	}
	
	if (name != NULL)
	{
		fputs(script, fichier);
		fclose(fichier);
			
	}
	else
	{
		fclose(fichier);
		fichier = fopen(name, "w+");
		fputs(script, fichier);
		
	}
	
}

void nft()
{
	
	
	
	
}

pour tatata.h(s'est le 1er nom qui mes venu a la tête);

Merci pour vous reponce.

Hors ligne

#2 Le 08/03/2010, à 14:13

zibletop

Re : probleme C

Salut,

Utilise un débugger ex: http://doc.ubuntu-fr.org/gdb cela te permettra d'identifier la commande qui provoque l'erreur.

a+

Hors ligne

#3 Le 08/03/2010, à 14:23

Coolgeek

Re : probleme C

le problème se situe dans ton .h je pense :

char name = " ";
char script = " ";

ici tu déclare une variable de type char. Celle-ci ne peux contenir qu'un seul caractère. Or, dans la suite du programme, tu veux y mettre une chaine de caractère. une bonne façon de s'y prendre pour déclarer une chaine de caractère serait ceci :

char name[256];
char script[256];

ensuite je vois que tu utilise 2 fois la même variable dans ton scanf :

printf("Le nom du fichier :\n");
scanf("%c", &name);
printf("Le script du fichier :\n");
scanf("%c", &name);

ici, une bonne méthode serait d'utiliser les 2 variables que j'ai déclarer précédemment :

printf("Le nom du fichier :\n");
scanf("%s", name);
printf("Le script du fichier :\n");
scanf("%s", script);

ensuite, concernant tes tests sur des chaines de caractères, il faut utiliser la fonction strcmp() (ou strncmp() pour ne pas prendre en compte la casse)

Pour rajouter une chaine de caractère a la fin d'une autre chaine, il faut utiliser strcat()

en espérant t'avoir été utile smile

Hors ligne

#4 Le 08/03/2010, à 18:10

linkof789

Re : probleme C

Merci beaucoup.
Alors pour gdb quand je compile (gcc -g ..... -o .....) sa me met :

In file included from main.c:4:
tatata.h: In function ‘nfc’:
tatata.h:7: warning: format ‘%c’ expects type ‘char *’, but argument 2 has type ‘char (*)[256]’
tatata.h:9: warning: format ‘%c’ expects type ‘char *’, but argument 2 has type ‘char (*)[256]’
tatata.h:14: error: invalid operands to binary + (have ‘char *’ and ‘char *’)

(Donc sa ne compile pas.)

Coolgeek tu pourrait me dire comment utiliser strcmp(), strncmp() et strcat().
(je suis TRÉS debutants : je ne connait pas toute les fonction du C.)

Hors ligne

#5 Le 08/03/2010, à 18:48

Uda

Re : probleme C

Salut,

Les erreurs sont liées au fait que tu n'utilises pas les fameuses fonctions strcmp/strcpy/strcat.

Tu trouveras une petite explication ici :
http://www.ltam.lu/Tutoriel_Ansi_C/prg-c81.htm
Le tutorial général qui peut te servir si tu débutes:
http://www.ltam.lu/Tutoriel_Ansi_C/

Les warning me laisse à penser que tu n'as par remplacer les %c par des %s dans le scanf.

Enfin, l'utilisation que tu fais du .h ne correspond pas vraiment à l'utilisation normal.
(Cela te posera des pbs lorsque tu auras plusieurs fichiers .c dans ton projet).

Si tu veux juste apprendre les bases de la programmation, le C est pas forcément le langage le plus simple pour débuter smile

A+

Hors ligne

#6 Le 08/03/2010, à 19:27

linkof789

Re : probleme C

Merci pour les tuto.
Mais j'ai toujours le même problème("invalid operands to binary + (have ‘char *’ and ‘char *’)" et "erreur de segmentation") mais merci quand même!!

Dernière modification par linkof789 (Le 08/03/2010, à 19:27)

Hors ligne

#7 Le 08/03/2010, à 23:14

Le Farfadet Spatial

Re : probleme C

Salut à tous !

   Linkof789, il y a quelque chose de très étrange dans ton code :

linkof789 a écrit :
	if (name != NULL)
	{
		fputs(script, fichier);
		fclose(fichier);
			
	}
	else
	{
		fclose(fichier);
		fichier = fopen(name, "w+");
		fputs(script, fichier);
		
	}

Le bloc « else » n'est exécuté que lorsque la condition du « if » précédant n'est pas vérifiée. Dans ton cas, cela signifie que le bloc « else » est exécuté seulement si « name » contient la valeur « NULL ». Du coup, « fopen(name, "w+") » est un rien problématique -- ici, cela signifie que tu fais « fopen(NULL, "w+") ». Je pense que le code que tu as posté ne correspond pas à ce que tu veux faire.

   Ce qui serait bien, c'est que tu détailles un peu ce que doit faire ton programme à terme et que tu postes le code tel qu'il est désormais -- afin que l'on puisse suivre précisément le code que tu es en train de déboguer.

   À bientôt.

                                                                                                                                 Le Farfadet Spatial

Hors ligne

#8 Le 09/03/2010, à 15:18

Coolgeek

Re : probleme C

Comme l'a dis Uda, les erreurs de compilation se situe au niveau des lignes suivantes :

scanf("%c", &name);
...
scanf("%c", &name);
...
name = name + "*.c";

pour les scanf(), il faut que tu remplace "%c" par "%s"

name étant une chaine de caractère, tu dois utiliser la fonctions strcat() afin d'ajouter ".c" a la fin du nom de fichier :

tu remplace donc

name = name + "*.c";

par

strcat(name,".c");

Hors ligne

#9 Le 09/03/2010, à 17:56

linkof789

Re : probleme C

Merci

void nft()
{
	FILE* fichier = NULL;
	char repn[256];
	char name[256];
	char rept[256];
	char text[256];
	printf("Le nom du fichier :\n");
	scanf("%s", repn);
	strcpy(name, repn);
	printf("Le contenu du fichier :\n");
	scanf("%s", rept);
	strcpy(script, reps);
	fichier = fopen(name, "r+");
	
	strcat(name,".c");
	
	
	if (name != NULL)
	{
		fputs(script, fichier);
		fclose(fichier);
			
	}
	else
	{
		fclose(fichier);
		fichier = fopen(name, "w+");
		fputs(script, fichier);
		
	}
	
}

void nft()
{
	
	
	
	
}

Voila pour tatata.h

#include <stdio.h>
#include <stdlib.h>
#include "tatata.h"

int main (int argc, char *argv[])
{
	int menuid;
	int con = 1;
	
	while (con)
	{
		printf("==== Writer ====\n\n");
		printf("1. Nouveau ficher texte\n");
		printf("2. Nouveau ficher vide\n");
		printf("3. Aide\n");
		printf("4. Quiter\n");
		scanf("%d", &menuid);
		
		printf("\n");
		
		switch (menuid)
		{
			case 1:
				nfc();
				break;
			case 2:
				printf("En construction!!!\n");;
				break;
			case 3:
				printf("Pour faire une tabulation ecriver \\t.\nPour faire un retour a la ligne ecriver \\n.\n");
				break;
			case 4:
				con = 0;
				break;
			default:
				printf("\n");
				break;
		}
	
		return 0;
	}
}

Pour main.c
(désoler mais maintenant s'est un éditeur de texte normal(pour faire des fichier .c il existe déjà des très bon editeur smile ))
Maintenant sa demande le nom du fichier puis le texte je met le texte puis sa me met erreur de segmentation. hmm

Dernière modification par linkof789 (Le 09/03/2010, à 18:09)

Hors ligne

#10 Le 10/03/2010, à 15:47

Coolgeek

Re : probleme C

le problème se situe dans le bloc ci dessous :

fichier = fopen(name, "r+");
    
    strcat(name,".c");
    
    
    if (name != NULL)
    {
        fputs(script, fichier);
        fclose(fichier);
            
    }
    else
    {
        fclose(fichier);
        fichier = fopen(name, "w+");
        fputs(script, fichier);
        
    }
    
}

tout d'abord, le "fopen(name, "r+");" n'a pas a être juste derrière la saisie. Tu dois faire un test afin de vérifier si le nom saisie n'est pas vide. C'est ce que tu essaie de faire avec le test du if :

 if (name != NULL)

Ce test ne sera jamais vrai puisque tu rajoute ".c" à la fin du nom du fichier saisie.

Il faudrait plutôt transformer ton code en ceci :

void nft()
{
    FILE* fichier = NULL;
    char repn[256];
    char name[256];
    char rept[256];
    char text[256];
    printf("Le nom du fichier :\n");
    scanf("%s", repn);
    strcpy(name, repn);
    if (strcmp(name,"")==0) /* test si le nom de fichier est vide */
	{
		printf("pas de nom saisie, retour au menu\n");
		return ;
	}
	
	printf("Le contenu du fichier. Il ne doit pas depasser 255 caractere :\n");
    scanf("%s", rept);
    strcpy(script, reps);
		
	if (strstr(name,".c")!=NULL) /* je cherche si ".c" est contenu dans le nom de fichier. Si il ne l'est pas, je l'ajoute a la fin */
	{
		strcat(name,".c");
	}

    fichier = fopen(name, "r+");
    
    if (fichier == NULL) /* test si le fichier existe */)
	{
		printf("le fichier n'existe pas, création d'un nouveau fichier\n");
		fichier = fopen(name, "w+");
	}
	else
	{
		printf("le fichier existe, il sera ecrase\n");
	}
    
	fputs(script, fichier); /* ecriture dans le fichier */
	fclose(fichier); /* fermeture du fichier */
}

A savoir que mettre du code dans un fichier .h n'est pas propre. Il aurait fallu que tu crée un fichier tatata.c avec le code de la fonction, un fichier tatata.h avec le header de ta fonction (void nft();) et que tu appelle tatata.h dans le fichier contenant le main()

Hors ligne