Textové řetězce v jazyku C



Dobrý den, kde mám chybu? Chci, aby se po zadání správného "hesla" vytiskl "libovolný text", ale ačkoliv to kompilátor projde, tak to nedělá, co má...  
  
#include   
#include   
  
int main(int argc, char *argv[])  
{  
 char jmeno[15];  
 scanf("%s",jmeno);  
 if (jmeno == "Heslo") printf("Heslo je OK!");  
 system("PAUSE");   
 return 0;  
}  
  
Děkuji předem!
Prosím, prosím, nenajde se zde nikdo, kdo by mi poradil ![](/Client.Images/smileys/8.gif)?
<p>v c++ existují tři <em> odlišné </em> typy znaků:</p><ul> <li><code>char</code>name\_\_</li> <li><code>signed char</code></li> <li><code>unsigned char</code></li> </ul><p>pokud používáte textové znaky pro text <em> </em>, použijte nekvalifikovaný <code>char</code>name\_\_:</p><ul> <li>je to typ znakových literálů jako <code>'a'</code> nebo <code>'0'</code>.</li> <li>je to typ, který tvoří řetězce c jako <code>"abcde"</code></li> </ul><p>funguje také jako číselná hodnota, ale není specifikováno, zda je s touto hodnotou zacházeno jako s podepsanou nebo nepodepsanou hodnotou. dávejte si pozor na porovnání postav prostřednictvím nerovností - i když pokud se omezíte na ascii (0-127), jste jen v bezpečí.</p><p>pokud používáte typy znaků jako <em> čísla </em>, použijte:</p><ul> <li><code>signed char</code>, což vám dává <em> alespoň </em> rozsah -127 až 127. (-128 až 127 je běžné)</li> <li><code>unsigned char</code>, což vám dává <em> alespoň </em> rozsah 0 až 255.</li> </ul><p>„alespoň“, protože standard c++ poskytuje pouze minimální rozsah hodnot, které musí každý číselný typ pokrýt. <code>sizeof (char)</code> musí být 1 (tj. jeden byte), ale byte by teoreticky mohl být například 32 bitů. <strong><code>sizeof</code>name\_\_ by i nadále vykazoval svou velikost jako <code>1</code></strong> - což znamená, že <em> můžete </em> mít <code>sizeof (char) == sizeof (long) == 1</code>.</p> <p>obecným případem, který pracuje s jakýmkoli příkazem, který píše do stdout, je použití <code>xargs</code>, které vám umožní připojit ke konci příkazu libovolný počet argumentů z příkazového řádku:</p><pre><code>$ find … | xargs grep 'search' </code></pre><p>nebo vložte příkaz do řádku <code>grep</code> pomocí backticks nebo <code>$()</code>, které příkaz spustí a nahradí jeho výstup:</p><pre><code>$ grep 'search' $(find …) </code></pre><p>tyto příkazy nefungují, pokud názvy souborů obsahují mezeru nebo určité jiné „divné znaky“ (<code>\'"</code> pro xargs, <code>\[*?</code> pro <code>$(find …)</code>).</p><hr><p>ve specifickém případě <code>find</code> je však zabudována schopnost provádět program na zadaných argumentech:</p><pre><code>$ find … -exec grep 'search' {} \; </code></pre><p>všechno mezi <code>-exec</code> a <code>;</code> je příkaz k provedení; <code>{}</code> je nahrazen názvem souboru nalezeným <code>find</code>. tím se provede samostatný <code>grep</code> pro každý soubor; protože <code>grep</code> může mít mnoho názvů souborů a prohledávat je všechny, můžete změnit <code>;</code> na <code>+</code>, abyste zjistili, že všechny odpovídající názvy souborů předáte <code>grep</code> na jednou:</p><pre><code>$ find … -exec grep 'search' {} \+ </code></pre> <p>pro výstup <code>foo {1, 2, 3}</code> musíte udělat něco jako:</p><pre><code>string t = "1, 2, 3"; string v = string.format(" foo {{{0}}}", t); </code></pre><p>pro výstup <code>{</code> použijte <code>{{</code> a pro výstup <code>}</code> použijte <code>}}</code>.</p> Nepřehlédněte kompilátor sám.


Přečtěte si dokumentaci kompilátor a najít všechny varování a chyby může poskytnout, a povolit tolik, kolik mají smysl pro vás.


Také se ujistěte, informujte svého kompilátoru k léčbě varování, jako jsou chyby, takže budete nuceni opravit hned. ( "-Werror" na gcc)


Také: „-Wall“ na gcc není *ani* umožnit všem varováním, nenechte se zmást.


Také také: check out Valgrind - it „automaticky detekovat [S] mnoho správy paměti a threading chyby a profil [s] rámci svých programů v detailu.“ (Zdarma!)


Valgrind není statický checker, ale je to skvělý nástroj! <http://valgrind.org> <p>použití</p><pre><code>ssh deploy@hera 'kill -9 `ps -ef | grep mapreducenode | grep -v "grep" | awk -f " " '"'"'{print $2}'"'"' | head -n 1`' </code></pre> <p>pomocí <a href="http://www.php.net/wordwrap">wordwrap</a> funkce. rozděluje texty do více řádků tak, že maximální šířka je ta, kterou jste zadali, a rozbíjí se na hranicích wordu. po rozdělení jednoduše vezmete první řádek:</p><pre><code>substr($string, 0, strpos(wordwrap($string, $your\_desired\_width), "\n")); </code></pre><p>jedna věc, kterou tento oneliner neřeší, je případ, kdy samotný text je kratší než požadovaná šířka. pro zvládnutí tohoto případu by měl člověk udělat něco jako:</p><pre><code>if (strlen($string) &gt; $your\_desired\_width) { $string = wordwrap($string, $your\_desired\_width); $string = substr($string, 0, strpos($string, "\n")); } </code></pre><hr><p>výše uvedené řešení má problém předčasného řezání textu, pokud obsahuje nový řádek před aktuálním bodem řezu. zde je verze, která tento problém řeší:</p><pre><code>function tokentruncate($string, $your\_desired\_width) { $parts = preg\_split('/([\s\n\r]+)/', $string, null, preg\_split\_delim\_capture); $parts\_count = count($parts); $length = 0; $last\_part = 0; for (; $last\_part &lt; $parts\_count; ++$last\_part) { $length += strlen($parts[$last\_part]); if ($length &gt; $your\_desired\_width) { break; } } return implode(array\_slice($parts, 0, $last\_part)); } </code></pre><p>také zde je testovací třída phpunit používaná k testování implementace:</p><pre><code>class tokentruncatetest extends phpunit\_framework\_testcase { public function testbasic() { $this-&gt;assertequals("1 3 5 7 9 ", tokentruncate("1 3 5 7 9 11 14", 10)); } public function testemptystring() { $this-&gt;assertequals("", tokentruncate("", 10)); } public function testshortstring() { $this-&gt;assertequals("1 3", tokentruncate("1 3", 10)); } public function teststringtoolong() { $this-&gt;assertequals("", tokentruncate("toooooooooooolooooong", 10)); } public function testcontainingnewline() { $this-&gt;assertequals("1 3\n5 7 9 ", tokentruncate("1 3\n5 7 9 11 14", 10)); } } </code></pre><h1><strong>upravit :</strong></h1><p>speciální znaky utf8 jako 'à' nejsou zpracovány. přidat 'u' na konci regexu pro zpracování:</p><p><code>$parts = preg\_split('/([\s\n\r]+)/u', $string, null, preg\_split\_delim\_capture);</code></p> <p>je to pravděpodobně výstupní vyrovnávací paměť z grepu. můžete to zakázat pomocí <code>grep --line-buffered</code>.</p><p>ale nemusíte potrubí výstup z grep do awk. awk umí regexp přizpůsobit všechny vzorky sám.</p><p><code>tail -f test.txt | awk '/beam/ {print $3}'</code></p> <p>ve skutečnosti to není samo o sobě vzorec uživatelského rozhraní, ale gmail a google reader v zásadě standardizovaly toto chování ve webových aplikacích a od té doby jsem se ho snažil sledovat:</p><ul> <li>žádné vstupní pole konkrétně; stačí nechat aplikaci reagovat na stisknutí kláves po celou dobu (s výjimkou zaměření na vstupní pole)</li> <li>typ? (shift + /) otevřete překrytí klávesové zkratky kdekoli v aplikaci.</li> <li>j &amp; k pro pohyb vpřed a vzad v kontextu, jako jsou e-maily nebo položky rss</li> <li>sekvence: například zadáním „g“ následovaným „i“ v gmailu „přejde“ do „doručené“</li> <li>namapujte co nejvíce klávesových zkratek na klávesy odpovídající akci, což by mělo pomoci zapamatování. "c" v gmailu znamená "napsat". výjimky z tohoto pravidla: další převažující konvence, jako jsou výše uvedené klíče j/k.</li> </ul><p>funkce „sekvence“ umožňuje reagovat na jednotlivá stisknutí kláves, aniž by uživatelé museli psát slova, a to (teoreticky) vám dává neomezené kombinace stisknutí kláves, protože máte tucet možností na klávesu v sekvenci. v této architektuře byste měli být schopni implementovat většinu příkazů, které chcete.</p><p>opravdu se mi líbí, jak to google implementoval - je příliš špatné, že to opravdu někde extrapolovali na návrhové vzory (pokud to neudělali a já mi to chybělo). bylo by hezké vidět více aplikací sledovat trend, který nastavily.</p> <p>řekněme, že chcete spustit:</p><pre><code>rm *.txt </code></pre><p>můžete jen spustit:</p><pre><code>echo rm *.txt </code></pre><p>nebo dokonce jen:</p><pre><code>echo *.txt </code></pre><p>abyste viděli, které soubory <code>rm</code> by se smazaly, protože to shell rozšiřuje <code>*.txt</code>, ne <code>rm</code>.</p><p>jediný čas, kdy vám to nepomůže, je <code>rm -r</code>.</p><p>pokud chcete odstranit soubory a adresáře rekurzivně, můžete použít <code>find</code> místo <code>rm -r</code>, např.</p><pre><code>find . -name "*.txt" -print </code></pre><p>pak pokud to dělá, co chcete, změňte <code>-print</code> to <code>-delete</code>:</p><pre><code>find . -name "*.txt" -delete </code></pre> <p>pokud musíte zachytit všechny výstupy příkazů, můžete použít dávku jako je tato:</p><pre><code>@echo off if not "%1"=="" goto addv set var= for /f %%i in ('dir *.txt /b /o:d') do call %0 %%i set var goto end :addv set var=%var%!%1 :end </code></pre><p>všechny výstupní linky jsou uloženy v var oddělené znakem &quot;!&quot;.</p><p>@ john: existuje pro to nějaké praktické využití? myslím, že byste měli sledovat powershell nebo jakýkoli jiný programovací jazyk, který je schopen provádět skriptovací úlohy snadno (python, perl, php, ruby)</p>