Цитата(darkart @ 4.12.2010, 11:50 ) | | там если пробелы в конце - лишнюю 0-строку печатает |
недоглядел я. ну можно перед 21й строкой кода лишнюю проверку вставить 
Цитата(darkart @ 4.12.2010, 11:50 ) | | и это smile ... в си нет ссылок smile |
вот это я не знал ну тогда вмесо передачи ссылки на переменную, можно обявить переменную p как глобальную, тогда н чего в когде особо-то и не поменяется .
вот так тогда будет:
| Код | #include <stdio.h> #include <stdlib.h>
#define N 255 int p;
void showword(const char *s) { char *word; //впринципе можно и word[N], если не хочется возиться с перераспределением памяти word = (char*)malloc(sizeof(char)*N+sizeof(char)); // N символов + 1 завершающий ноль int i = 0; //индекс для массива word while(s[p]!='\0') { for(;s[p]==' ' && s[p]!='\0';++p); //если в анчале есть пробелы, пропускаем их for(;s[p]!=' ' && s[p]!='\0';++p,++i) //копируем до первого пробела word[i] = s[p]; //перераспределяем память. Лишняя выдлеленная память ни к чему word = (char *) realloc(word,sizeof(char)*i); //i - количество букв в слове + 0 if(s[p]!='\0') //если не равно, то значит в строке есть еще символы showword(s); } if(i) { printf("%s ", word); //выводить слова будем при выходе из реккурсии free(word); //освобождаем память } }
void showreverse(const char *s) { p = 0; printf("Reverse:\n"); showword(s); //с первого символа }
int main() { char s[N]; printf("Enter a string...\n"); gets(s); showreverse(s); return 0; }
|

а так будет, если подключить string.h:
| Код | #include <stdio.h> #include <stdlib.h> #include <string.h>
#define N 255
void showword(char *s, char *divider) { char *word; if(s=strtok(s,divider)) { word = strdup(s); showword('\0',divider); printf("%s ", word); //выводить слова будем при выходе из реккурсии free(word); //освобождаем память } }
void showreverse(const char *s) { printf("Reverse:\n"); char *buf = strdup(s); showword(buf, " "); free(buf); }
int main() { char s[N]; printf("Enter a string...\n"); gets(s); showreverse(s); printf("\n"); return 0; }
|
 |