Newsgroup: it.comp.lang.c
Titolo: Qualcuno mi sa spiegare perché....

... questo programma non fa esattamente quello che deve?
Vi do il listato intero, ma il problema è conentrato solo nel 
ramo del main "if (scelta == 3)". Quello che volevo io era che il 
programma inserisse la stringa NULL nei punti desiderati, ma non 
lo fa... anzi, quando controllo il contenuto della memoria per 
vedere se l'ha fatto, mi accorgo che tutto è rimasto com'era. 
Cos'è che non va?
#include <windows.h>
#include <stdio.h>
#define gap 512
#define slotsize 512
int main(){
HANDLE map, mutex;
char *pointer, *endpointer, scelta, testo [480], mex;
long counter;
// creazione del mutex
mutex = CreateMutex(NULL, FALSE, "artemis");
if(mutex==NULL){
    printf("Impossibile creare il semaforo\n");
    ExitProcess(-1);
}
// creazione della memoria condivisa
map = CreateFileMapping(INVALID_HANDLE_VALUE,
      NULL,
      PAGE_READWRITE,
      0,
      50000,
      "mnemesyne");
if(map==INVALID_HANDLE_VALUE){
    printf("Impossibile creare la memoria condivisa\n");
    ExitProcess(-1);
}
map = OpenFileMapping(FILE_MAP_WRITE,TRUE,"mnemesyne");
pointer = (char *)MapViewOfFile(map,FILE_MAP_WRITE,0,0,0);
strncpy(pointer,"Oggetto:\nBenvenuto",slotsize); pointer += gap;
strncpy(pointer,"quit",slotsize); pointer += gap;
strncpy(pointer,"Testo:\nQuesta e' la tua bacheca!",slotsize); 
pointer +=gap;
strncpy(pointer,"quit",slotsize); pointer += gap;
endpointer = pointer;
strncpy(endpointer+gap,"end",slotsize);
do{
printf("\n1. Leggi i messaggi\n2. Scrivi un messaggio\n3. 
Cancella un messaggio\n4. Esci\n\n");
scanf("%d", &scelta);
if (scelta == 1){
    WaitForSingleObject(mutex, INFINITE);
     map = OpenFileMapping(FILE_MAP_WRITE,TRUE,"mnemesyne");
     pointer = (char *)MapViewOfFile(map,FILE_MAP_WRITE,0,0,0);
         while(strcmp(pointer,"end") != 0) {
         printf("%s\n", pointer);
         pointer += gap;
         }
     ReleaseMutex(mutex);
     }
if (scelta == 2){
     WaitForSingleObject(mutex, INFINITE);
     map = OpenFileMapping(FILE_MAP_WRITE,TRUE,"mnemesyne");
     pointer = endpointer;
     printf("\nOggetto del messaggio ('quit' per terminare):\n");
     strncpy(pointer,"\nOggetto:", slotsize); pointer+=gap;
		  do {
          scanf("\n%s",testo);
          strncpy(pointer,testo, slotsize);
          pointer += gap;
          } while((strcmp(testo,"quit") != 0));
     printf("\nTesto del messaggio ('quit' per terminare):\n");
     strncpy(pointer,"Testo:", slotsize);pointer+=gap;
          do {
          scanf("\n%s",testo);
          strncpy(pointer,testo, slotsize);
          pointer += gap;
          } while((strcmp(testo,"quit") != 0));
     endpointer = pointer;
     strncpy(endpointer+gap,"end",slotsize);
     ReleaseMutex(mutex);
     }
if (scelta == 3){
     WaitForSingleObject(mutex, INFINITE);
     map = OpenFileMapping(FILE_MAP_WRITE,TRUE,"mnemesyne");
     pointer = (char *)MapViewOfFile(map,FILE_MAP_WRITE,0,0,0);
	 printf("\nNumero del messaggio da cancellare?\n");
	 scanf("\n%d",&mex);
		while(strcmp(pointer,"end") != 0) {
        pointer += gap;
		if(strcmp(pointer,"quit") != 0)
		counter++;
		if (counter >= 2*mex-2 && counter < 2*mex)
		strncpy(pointer,"NULL", slotsize);
		}
    ReleaseMutex(mutex); 
	}
}while(scelta!=4);
}
Ah, inoltre, conoscete una funzione per immettere testo da 
tastiera che a differenza di scanf accetti un'intera frase e non 
la divida in diverse parole ogni volta che compare _blank?
Grazie per l'eventuale risposta.
-- 
Lord Gas, the Waxen - Blasfemo di IFTMDG - Penguin's Enemy #1 
[ICQ: 57483751][the Waxen Pith: 
http://www.snipp.org/gas
]
... "Goddamn, there's always such a big temptation to be good"
... (Tom Waits - God's Away on Business)


Usa una delle seguenti:
1)     char *gets(char *s);
2)     char *fgets(char *s, int size, FILE *stream);
3)     int getchar(void);
(1)
char riga[MAX_RIGA];
gets(riga);
(2)
char riga[MAX_RIGA];
fgets(riga,MAX_RIGA,stdin);
(1)
char riga[MAX_RIGA];
int i;
for (i=0; (riga[i] = getchar()) != '\n'; i++);
riga[i] = '\0';
Ciao,
Ema

 fgets(riga,MAX_RIGA,stdin);
le stringhe e' sempre meglio dichiararle MAX+1 cosi' quando passi a fgets 
c'e' spazio x inserire il \0 :) quindi char riga[MAX_RIGA+1] e poi 
fgets(riga,MAX_RIGA,stdin);
Luca
-- 
....~.......xin\@IRCNet (mostly xin\aWAy 24/7 ghgh).../"\
.../V\......Email: xi...@despammed.com................\ /
..// \\.....ICQ UIN: 63088554..........................\
./(   )\........................ASCII Ribbon Campaign./ \
..^`~'^.........................Against HTML Mail and News

 poi fgets(riga,MAX_RIGA,stdin);
fgets legge MAX-1 caratteri e riserva l'ultimo byte, di indice MAX-1, 
al '\0': per cui facendo come hai detto ottieni soltanto di sprecare 
un byte.
Saluti
-- 
Per l'e-mail rimuovere la frase in maiuscolo e gli underscore.

 Saluti
grazie sta cosa non la sapevo ^_^ 
