302cc9b4780f8cbef6f70c3a8417913050b6aafb ([info]mindbound) rakstīja [info]koderi kopienā,
@ 2009-03-19 16:27:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
The number of ending newlines
Es zinu, ka risinājums ir triviāls, taču nelabvēlīgu apstākļu sakritības (nepilnas diennakts attāls deadline + nelietīga migrēna = pilnīga domātnespēja) dēļ griežos pēc publiskas palīdzības. Vajadzība ir pēc funkcijas (C/C++), kura dotajā stringā saskaitītu pēc kārtas sekojošus beigu (un tikai beigu, i.e. "strstr\nstr\n\n\n\n" = 4) newline characterus. Jau iepriekš pateicos par uzmanību, thanks in advance utt., utjpr.


(Ierakstīt jaunu komentāru)


[info]bubu
2009-03-19 17:57 (saite)
Tur jau nekas vairāk par prastu ciklu ar if'u iekšā nav... C labi nemāku, tapēc reku smuks C++ kods:
size_t count_ending_endlines(const std::string& str)
{
    for (std::string::const_reverse_iterator it = str.rbegin(); it != str.rend(); ++it)
    {
        if (*it != '\n')
        {
            return std::distance(str.rbegin(), it);
        }
    }
    return str.empty() ? 0 : str.size();
}

(Atbildēt uz šo) (Diskusija)


[info]cannibalsmith
2009-03-19 18:07 (saite)
int trailing_newline_count(char* s)
{
	int i = 0;
	while (s[i] != 0) ++i;
	--i;
	int result = 0;
	while (s[i] == '\n' && i >= 0)
	{
		++result;
		--i;
	}
	return result;
}

(Atbildēt uz šo) (Iepriekšējais)


[info]mindbound
2009-03-23 15:08 (saite)
Šoreiz tas nedarbosies, and this is why (vienlaikus atvainojos, ka palaidu to garām un nenorādīju jau pašā sākumā): šajā gadījumā ņūlaini ir XML teksta nodes beigās, kur (vismaz TinyXML parseris un vismaz man) tos reprezentē nevis kā standarta '\n', bet kā Unicode entitāti "
", kuru nevaru šādi padot iteratoram. Iespējams, ka risinājums ir tikpat triviāls, taču ar STL es pagaidām esmu diezgan "uz Jūs" statusā.

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]bubu
2009-03-23 15:16 (saite)
Nekas jau iteratoram nav "jāpadod". Tas '\n' čarakters jāsalīdzina ar iteratora vērtību.
Taču tagad izklausās, ka tev vajag skaitīt nevis čarakterus '\n', bet stringus " " - cik tādu ir stringa beigās?
Tad jāraksta pavisam savādāk - taisi ciklu, kurā visu laiku no stringa beigām ar substr paņem 6 simbolus un salīdzini ar to entīti. Ja sakrīt tad skaits++, ja nē, tad return skaits.

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]mindbound
2009-03-23 17:49 (saite)
Ja ar string::rfind, tad kā man kustēties cauri virknei? Pašu pēdējo instanci atrast šķiet elementāri,
int loc = str.find_last_of(" ");
,taču šobrīd nespēju prātā uzģenerēt pašu ciklu. Excuse me if I am bothering.

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]bubu
2009-03-23 18:03 (saite)
Kā kustēties? Nu ļoti vienkārši - uzturi skaitītāju, kuru pārbīdi.

size_t count_ending_newlines(const std::string& str)
{
    const std::string newline = "
";
    const size_t newline_size = newline.size();

    size_t pos = str.size();
    while (pos >= newline_size)
    {
        if (str.substr(pos - newline_size, newline_size) != newline)
        {
            break;
        }
        pos -= newline_size;
    }

    return (str.size() - pos) / newline_size;
}

(Atbildēt uz šo) (Iepriekšējais)


Neesi iežurnalējies. Iežurnalēties?