char *p = malloc(strlen(argv[2]+4));
sprintf(p, "my %s", argv[2]);
argv[2] = p;
char *values[] = {
"0000001",
"1001111",
"0010010",
"0000110",
"1001100",
"0100100",
"0100000",
"0001111",
"0000000",
"0000100"
};
values[i]
будет адресом i-й строки, а values[i][j]
— j-й символ в i-й строке. int strcmp(char *a, char *b){
int ret = 0;
do{ ret = (int)(*a++) - (int)(*b++); }while(!ret && *a && *b);
return ret;
}
char *in = get_serial_buf(); // функция, возвращающая указатель на первый байт в кольцевом приемном буфере USART
char *ref = "строка";
if(!strcmp(in, ref)){ // действия, выполняемые при равенстве строк
}
int strstr(char *haystack, char *needle){
char *ret = NULL, *n = needle+1, n0 = needle[0];
do{
int cmp;
if(*haystack != n0) continue;
ret = haystack++;
do{ cmp = (int)(*haystack++) - (int)(*n++); }while(!cmp && *haystack && *n);
if(!cmp && !*n) break; // found
ret = NULL; n = needle + 1;
if(!haystack) break; // haystack ended while not found
}while(*(++haystack));
return ret;
}
gcc map.c -o map && ./map map.c
File contents:
#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
typedef struct{
char *data;
size_t len;
} mmapbuf;
#define ERR(...) do{fprintf(stderr, __VA_ARGS__); exit(-1);}while(0)
mmapbuf *My_mmap(char *filename){
int fd;
char *ptr;
size_t Mlen;
mmapbuf *ret;
struct stat statbuf;
if(!filename) ERR("No filename given!");
if((fd = open(filename, O_RDONLY)) < 0)
ERR("Can't open %s for reading", filename);
if(fstat (fd, &statbuf) < 0)
ERR("Can't stat %s", filename);
Mlen = statbuf.st_size;
if((ptr = mmap (0, Mlen, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
ERR("Mmap error for input");
if(close(fd)) ERR("Can't close mmap'ed file");
ret = malloc(sizeof(mmapbuf));
ret->data = ptr;
ret->len = Mlen;
return ret;
}
void My_munmap(mmapbuf *b){
if(munmap(b->data, b->len))
ERR("Can't munmap");
free(b);
}
int main(int argc, char **argv){
if(argc != 2) return 1;
mmapbuf *readfile = My_mmap(argv[1]);
printf("File contents:\n%s\n", readfile->data);
My_munmap(readfile);
return 0;
}