Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <malloc.h>
- char *getStr();
- char *reorg(char *);
- char *skipSpace(char *);
- char *skipWord(char *);
- char *copyWord(char *, char *);
- char *getStr()
- {
- char buf[21];
- int n, len = 0, curLen;
- char *ptr = (char *)malloc(1);
- *ptr = '\0';
- do{
- n = scanf_s("%20[^\n]", buf, 21);
- if (n < 0){
- free(ptr);
- ptr = NULL;
- continue;
- }
- if (n > 0){
- curLen = strlen(buf);
- len += curLen;
- ptr = (char *)realloc(ptr, len + 1);
- strcat_s(ptr, len + 1, buf);
- }
- else
- scanf_s("%*c", 0);
- } while (n > 0);
- return ptr;
- }
- int main()
- {
- char *s = NULL, *p = NULL;
- while (puts("enter..."), s = getStr()){
- printf("Source string: \"%s\"\n", s);
- p = reorg(s);
- printf("Result string: \"%s\"\n", p);
- free(s);
- free(p);
- }
- puts("That's all. Bye!");
- return 0;
- }
- char *reorg(char *s)
- {
- // Выделяем память под результирующую строку
- char *p = (char *)malloc(strlen(s) + 1);
- char *tmp = p,first,last,*buf;
- *tmp = '\0'; // нуль ограниченная результирующая строка
- if (*(s = skipSpace(s))){
- first = s[0];
- tmp = copyWord(s, tmp);
- s = skipWord(s);
- last = s[-1];
- }
- // Пропускаем лидирующие пробелы.
- while (*(s = skipSpace(s))){
- if (s[0] == first){
- buf = skipWord(s);
- if (buf[-1] == last){
- tmp = copyWord(s, tmp);
- }
- }
- s = skipWord(s);
- }
- // удаление хвостового пробела
- if (p != tmp)
- *--tmp = '\0';
- p = (char *)realloc(p, strlen(p) + 1);
- return p;
- }
- char *skipSpace(char *s)
- {
- int k = strspn(s, " \t");
- return s + k;
- }
- char *skipWord(char *s)
- {
- int k = strcspn(s, " \t");
- return s + k;
- }
- char *copyWord(char *from, char *to)
- {
- int k = strcspn(from, " \t");
- int l = strlen(to) + k;
- strncat_s(to, l + 1, from, k);
- to += k;
- *to++ = ' ';
- *to = '\0';
- return to;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement