Portál AbcLinuxu, 25. dubna 2024 21:22


Dotaz: Escapované znaky jako argumenty v shellu a C

15.9.2005 22:37 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Escapované znaky jako argumenty v shellu a C
Přečteno: 216×
Odpovědět | Admin
Existuje nějaká funkce v C, která dokáže nahradit řetězec "\n" znakem konec řádku '\n' (samozřejmě i ostatní backslashed sekvence, jako '\t', ...)? Problém je, že parametry v shellu se předávají tímto způsobem - pokud chci konec řádku '\n', dostanu dva znaky '\' a 'n'.

Tj. mám program foo -o "x=%x\ny=%y" a textové části se tisknou fputs(f,stdout);. Výstupem je tedy x=3\ny=4.
When your hammer is C++, everything begins to look like a thumb.
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.9.2005 22:47 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Escapované znaky jako argumenty v shellu a C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Takových funkcí je spousta... Ale ve standardní knihovně není žádná, pokud se ptáš na tohle.
15.9.2005 22:51 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Escapované znaky jako argumenty v shellu a C
Vzhledem k tomu, že to má být do pingu, tak by se mi hodilo něco pod BSD licencí, jinak si to budu muset napsat sám, nebo tuhle featurku oželet (lsof to taky neumí, jak jsem zjistil).
When your hammer is C++, everything begins to look like a thumb.
15.9.2005 23:17 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Escapované znaky jako argumenty v shellu a C
Dávám tuto implementaci do public domain. Je asi bugovitá, protože jsem ji právě napsal z hlavy. Neumí \xAB a \012, ale to snad tak nevadí...
#include <stdio.h>
#include <string.h>

int
main(int argc,
     char *argv[])
{
    while (*(++argv)) {
        const char *s = *argv, *p;
        char c;

        while ((p = strchr(s, '\\'))) {
            printf("%.*s", p - s, s);
            s = p+1;
            if (!(c = *s)) {
                fprintf(stderr, "String ends with a backslash\n");
                break;
            }
            switch (c) {
                case '\\': c = '\\'; break;
                case '0': c = '\0'; break;
                case 'a': c = '\a'; break;
                case 'b': c = '\b'; break;
                case 'e': c = '\x1b'; break;
                case 'f': c = '\f'; break;
                case 'n': c = '\n'; break;
                case 'r': c = '\r'; break;
                case 't': c = '\t'; break;
                case 'v': c = '\v'; break;

                default:
                fprintf(stderr, "Unknown escape `%c'\n", c);
                break;
            }
            putchar(c);
            s++;
        }
        puts(s);
    }

    return 0;
}
Lepší by bylo něco, co převede string na string -- což v principu lze i printf() funkcemi, ale je to otrava.
15.9.2005 23:37 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Escapované znaky jako argumenty v shellu a C
Vzhledem k uvažovanému použití je ale lepší dělat strcspn(string, "%\\") a expandovat obojí zároveň, jen se musíš rozhodnout, jak interpretovat dva různé escape znaky vedle sebe...
15.9.2005 22:47 #Tom
Rozbalit Rozbalit vše Nejsem si jist, jestli jsem to pochopil...
Odpovědět | | Sbalit | Link | Blokovat | Admin
Napadá mě akorát tohle:
#include <stdio.h>
int main() {
  char buffer[128], *p;
  sprintf(buffer, "Ahoj\n");
  for (p = buffer; *p != '\0'; p++)
    printf("%02x ", *p);
  printf("\n");
  return 0;
}
Vypíše se toto:
41 68 6f 6a 0a
15.9.2005 22:56 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Nejsem si jist, jestli jsem to pochopil...
Jde o to, že ze shellu dostanu "Ahoj\\n", tj řetězec o délce 6 se znaky 'A','h','o','j','\\','n'. No a já potřebuji funkci, která nahradí dvojznak "\\n" za konec řádku '\n' - tj, výsledný řetězec bude mít 5znaků (Ahoj+konec řádku).
When your hammer is C++, everything begins to look like a thumb.
16.9.2005 00:20 #Tom
Rozbalit Rozbalit vše Re: Nejsem si jist, jestli jsem to pochopil...
Tak jsem trošku pozapomněl, co se dělá už při překladu a co za běhu. Tohle už je lepší:
#include <stdio.h>

int tab[] = {
  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  /* \% */'\%', -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,/* \0 */'\0',-1,-1,-1,
  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,'\\',-1,-1,-1,-1,
  /* \a */'\a', /* \b */'\b', -1,-1,/* \e */'\e', /* \f */'\f',
  -1,-1,-1,-1,-1,-1,-1,/* \n */'\n', -1,-1,-1,/* \r */'\r',-1,
  /* \t */'\t', -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  -1,-1,-1,-1,-1,-1,-1,-1,-1 };

char *zpracuj_lomitka(char *str) {
  unsigned char *a, *b;
  if (str == NULL) return NULL;
  for (a = b = str; *a != '\0'; a++, b++)
    if (*a == '\\' && tab[a[1]] >= 0)
      *b = tab[*++a];
    else
      *b = *a;
  *b = '\0';
  return str;
}

int main() {
  char *p, str[] = "Ahoj!\\a\\b\\e\\f\\n\\r\\t\%\\\\\\0";
  for (p = str; *p != '\0'; p++)
    printf("%02x ", *p);
  printf("\n");
  zpracuj_lomitka(str);
  for (p = str; *p != '\0'; p++)
    printf("%02x ", *p);
  printf("\n");
  return 0;
}
Přepisuje se přímo zdrojový řetězec. Možná to proto hodí segfault (což udělá určitě, když dám místo str[] jen *str), ale ta funkce by měla být jinak v pořádku.
15.9.2005 22:51 0
Rozbalit Rozbalit vše Re: Escapované znaky jako argumenty v shellu a C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Resim to prostym pouzitim sscanf.
15.9.2005 23:02 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Escapované znaky jako argumenty v shellu a C
Mohl bys to, prosím, trochu rozvést? Nějak nevím, jak by mi sscanf mohl pomoci.
When your hammer is C++, everything begins to look like a thumb.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.