в C не шарю , так что за код не пинайте .
надо сделать следуюшее
есть строка вида abc.defg надо ее вывести в виде defg.abc
вот во что вылились мои мучения :
#include <stdio.h>
#include <string.h>
int main ()
{
char str[255];
char* array[255];
char* block[255];
char* *ps=block;
int sz,bs,i,j,k=0;
scanf("%s",str);
sz = strlen (str);
j = 0;
printf("string = %s\n",str);
for (i = 0 ; i<=sz ; i++) {
if (str[i] == '.') {
j++;
i++;
}
block[j][i] = str[i];
}
for (k=j ; k>=0; k--) {
array[k] = ps[k];
}
for (i = j ; i >=0 ; i-- ) {
printf("%s.",array[i]);
}
//printf("array=%d",bs);
}
в итоге после запуска выводит подобную хрень
./dot
abc.defg
string = abc.defg
Õù·defg.abc.
откуда берутся начальные символы Õù·??
и что я делаю не правильно ?
> Segmentation fault
Бугага. Си - без вопросов лучший инструмент для подобных задачь.
In [6]: '.'.join(reversed('defg.abc'.split('.')))
Out[6]: 'abc.defg'
идея была записывать в некоторый массив символы , пока не дойдет до '.'
потом этот содержимое этого массива block[j] передавать в array
при этом хотелось чтобы название block было динамическим
после этого в array по идее должно было оставаться 2 элемента abc,defg
кстати я проверил на другой машине в segfault не выпадает . но полюбому как-то криво вышло , ваш код я более менее понял , но хочу сделать по другому .
посмотю на функции strings.h
Если не два, можно так.
#include <string.h>
#include <stdio.h>
int main(void) {
char s[256];
char *p;
strcpy(s, "my.name.is.Yoda.Minch");
while ( (p=strrchr(s,'.')) != NULL) {
*p=0;
printf("%s.", p+1);
}
printf("%s\n", s);
return 0;
}
или с меньшим количеством проходов и без изменения массива.
(хотя код несколько странный)
#include <string.h>
#include <stdio.h>
int main(void) {
char *s="my.name.is.Yoda.Minch";
int i,j;
for (i=strlen(s)-1;i>=-1;i--)
if (i==-1||s[i]=='.') {
for (j=i+1;s[j]!='.'&&s[j]!=0;j++)
putchar(s[j]);
if (i!=-1) putchar('.');
}
putchar('\n');
return 0;
}
По-моему, так. (C)
Спасибо :)
Единственная тонкость: "if (i==-1||s[i]=='.')". Должно быть записано
именно в таком порядке, потому что иначе будет обращение к -1 элементу
массива (т.е. выход за границы выделенной памяти). Ошибки нет, но стиль не самый хороший.
Наверное, так будет правильнее:
#include <string.h>
#include <stdio.h>
#define SEP '.'
void print_until_dot(char *s) {
int i;
for (i=0;s[i]!=SEP&&s[i]!=0;i++)
putchar(s[i]);
}
int main(void) {
char *s="my.name.is.Yoda.Minch";
int i;
for (i=strlen(s)-1;i>=0;i--)
if (s[i]==SEP) {
print_until_dot(s+i+1);
putchar(SEP);
}
print_until_dot(s);
putchar('\n');
return 0;
}
P.S. И всё же в высокоуровневых языках есть своя прелесть.
Python 2.5.1 (r251:54863, May 2 2007, 16:56:35)
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="my.name.is.Yoda.Minch"
>>> b=a.split('.')
>>> b.reverse()
>>> '.'.join(b)
'Minch.Yoda.is.name.my'
Хотя да, у Руби получается по-короче (почему-то reverse в питоне ничего не возвращает).
for(int n = 0, last = -1; ii != s.rend(); ++ii, ++n)
{
if(*ii == '.')
{
res += s.substr(s.size() - n, n - last - 1) + '.'; /*cout << s.substr(s.size() - n, n - last - 1) + '.';*/
last = n;
}
if(ii + 1 == s.rend() ) res += s.substr(0, s.size() - last - 1);
}
for(int n = 0, last = -1; ii != s.rend(); ++ii, ++n)
{
if(*ii == '.')
{
res += s.substr(s.size() - n, n - last - 1) + '.'; /*cout << s.substr(s.size() - n, n - last - 1) + '.';*/
last = n;
}
if(ii + 1 == s.rend() ) res += s.substr(0, s.size() - last - 1);
}
for(int n = 0, last = -1; ii != s.rend(); ++ii, ++n)
{
if(*ii == '.')
{
res += s.substr(s.size() - n, n - last - 1) + '.'; /*cout << s.substr(s.size() - n, n - last - 1) + '.';*/
last = n;
}
if(ii + 1 == s.rend() ) res += s.substr(0, s.size() - last - 1);
}