Mon devoir est de prendre une chaîne et de la diviser en morceaux à chaque nouvelle ligne. Je ne sais pas quoi faire! Aidez-moi!
Remarque: Il s'agit d'une question de contrôle de code . Veuillez ne pas prendre la question et / ou les réponses au sérieux. Plus d'informations ici .
code-trolling
Turion
la source
la source
Réponses:
C
Problème délicat pour une classe de programmation C débutante! Vous devez d'abord comprendre quelques notions de base sur ce sujet compliqué.
Une chaîne est une séquence composée uniquement de caractères . Cela signifie que pour que les programmeurs indiquent une chose "invisible" (ce n'est pas un espace, qui compte comme un caractère), vous devez utiliser une séquence spéciale de caractères pour signifier cette chose invisible.
Sous Windows , la nouvelle ligne est une séquence de deux caractères dans la chaîne: barre oblique inverse et n (ou la chaîne
"\n"
)Sous Linux ou Mac OS / X , il s'agit d'une séquence de quatre caractères: barre oblique inverse, n, barre oblique inverse, puis r: (ou
"\n\r"
).(Note historique intéressante: sur les Macintoshes plus anciens, c'était une séquence différente de quatre caractères: "\ r \ n" ... totalement en arrière par rapport à la façon dont Unix faisait les choses! L'histoire prend des routes étranges.)
Il peut sembler que Linux est plus gaspilleur que Windows, mais c'est en fait une meilleure idée d'utiliser une séquence plus longue. Étant donné que Windows utilise une séquence aussi courte, le runtime du langage C ne peut pas imprimer les lettres réelles
\n
sans utiliser d'appels système spéciaux. Vous pouvez généralement le faire sous Linux sans appel système (il peut même imprimer\n\
ou\n\q
... tout sauf\n\r
). Mais puisque C est censé être multiplateforme, il applique le plus petit dénominateur commun. Vous verrez donc toujours\n
dans votre livre.(Remarque: si vous vous demandez comment nous parlons
\n
sans obtenir de nouvelles lignes à chaque fois que nous le faisons, StackOverflow est écrit presque entièrement en HTML ... pas C. Donc c'est beaucoup plus moderne. Beaucoup de ces anciens aspects de C sont être abordé par des choses dont vous avez peut-être entendu parler, comme CLANG et LLVM.)Mais revenons à ce sur quoi nous travaillons. Imaginons une chaîne avec trois pièces et deux sauts de ligne, comme:
Vous pouvez voir que la longueur de cette chaîne est 3 + 2 + 3 + 2 + 3 = 13. Vous devez donc créer un tampon de longueur 13 pour cela, et les programmeurs C en ajoutent toujours un à la taille de leurs tableaux pour être sûr. Faites donc votre tampon et copiez-y la chaîne:
Maintenant, ce que vous avez à faire est de rechercher ce modèle à deux caractères qui représente la nouvelle ligne. Vous n'êtes pas autorisé à rechercher juste une barre oblique inverse. Parce que C est beaucoup utilisé pour le fractionnement de chaînes, il vous donnera une erreur si vous essayez. Vous pouvez le voir si vous essayez d'écrire:
(Remarque: Il y a un paramètre dans le compilateur pour si vous écrivez un programme qui ne recherche que des antislashs. Mais c'est extrêmement rare; les antislashs sont très rarement utilisés, c'est pourquoi ils ont été choisis à cet effet. Nous ne tournerons pas cela allumer.)
Faisons donc le modèle que nous voulons vraiment, comme ceci:
Lorsque nous voulons comparer deux chaînes d'une certaine longueur, nous utilisons
strncmp
. Il compare un certain nombre de caractères d'une chaîne potentiellement plus grande et vous indique s'ils correspondent ou non. Renvoie doncstrncmp("\nA", "\nB", 2)
1 (vrai). C'est même si les chaînes ne sont pas entièrement égales sur la longueur de trois ... mais parce que seulement deux caractères sont nécessaires.Passons donc en revue notre tampon, un caractère à la fois, en recherchant la correspondance de deux caractères avec notre modèle. Chaque fois que nous trouvons une séquence à deux caractères d'une barre oblique inverse suivie d'un n, nous utiliserons l' appel système très spécial (ou "syscall")
putc
pour émettre un type spécial de caractère: le code ASCII 10 , pour obtenir une nouvelle ligne physique .La sortie de ce programme est le résultat souhaité ... le split de chaîne!
\t
est pour \ trolling ......
...
...
la source
Toutes nos félicitations! Votre chaîne doit maintenant être divisée. Sinon, répétez les étapes jusqu'à ce que ce soit le cas. Si vous avez répété les étapes plusieurs fois et que la chaîne n'est pas coupée, essayez d'utiliser des ciseaux plus affûtés.
AVIS DE NON-RESPONSABILITÉ: Je ne suis pas responsable des dommages qui vous sont appliqués au cours du processus.
la source
Python
Je me sens tellement mal qu'on vous a posé une question aussi évidente que les devoirs. Un langage très avancé tel que Python en fait un simple doublé:
Veuillez voter et accepter.
la source
C
En C c'est très simple:
Appelez ça comme ceci:
Exemple de travail:
http://codepad.org/GBHdz2MR
Pourquoi c'est mal:
printf
fonction pour diviser les chaînes#define
(et même ceux qui le comprennent)la source
Cela peut être fait en quelques lignes de code par l'algorithme simple suivant:
Cependant, c'est du gaspillage. Il s'agit essentiellement d'un algorithme de recherche linéaire , qui a une complexité temporelle linéaire (O (n)). Je vais vous présenter une technique plus avancée: la recherche binaire . La recherche binaire est beaucoup plus efficace que la recherche linéaire: elle n'a qu'une complexité temporelle logarithmique (O (log (n)). Cela signifie que si l'espace de recherche est deux fois plus grand, le temps de recherche ne double pas, il ne fait qu'augmenter de un montant fixe!
Le code pour la recherche binaire est un peu plus compliqué, car il utilise les techniques avancées de récursivité et de diviser pour mieux régner . Mais cela en vaut vraiment la peine pour les performances. Si vous soumettez cela, je pense que vous obtiendrez un crédit supplémentaire.
L'essentiel de l'algorithme est le suivant:
Vous n'avez pas spécifié de langue, je l'ai donc écrite en Python. Dans le monde réel, bien sûr, les gens n'écrivent pas en Python - utilisez C ou C ++ (ou mieux encore, le langage d'assemblage) pour de vraies performances. Ne vous inquiétez pas si vous ne comprenez pas ce que fait tout le code - il s'agit définitivement de choses avancées.
Bien sûr, toutes les déclarations sur les performances sont fausses. L'algorithme «simple» peut être linéaire ou quadratique selon la façon dont vous l'interprétez. L'algorithme «avancé» est Θ (n × log (n)) (assez proche du linéaire dans la pratique), mais boy, est la constante multiplicative élevée en raison de la reconstruction incessante de la liste (que la mise en œuvre sort quelque peu de son chemin pour favoriser ).
Le style Python, le style de commentaire, les déclarations sur les choix de langue et à peu près tout le reste dans ce post ne reflètent pas non plus mon opinion ou mes habitudes réelles.
la source
Visual Basic
La
IO
monade a une fonction pour le faire!la source
C ++
std::strstream
strstream
std::
préfixela source
Python 3 (net et propre)
la source
#define
? ;-)Rubis
Eh bien, vous voyez d'abord, vous devez en faire un tableau comme celui-ci
Maintenant, vous devez mettre les éléments sous forme de chaînes
Oh, supprimez aussi cette dernière virgule
Oups oublié, vous devez mettre les crochets pour être un tableau
Maintenant, utilisez simplement la chaîne et vous avez terminé
Malveillance:
split
eval
'
ou,
la source
Lua
Exemple d'entrée:
"Hello\nworld\nstuff"
Sortie:
{"pieces","pieces","pieces","pieces","pieces","pieces"}
Oh et j'ai oublié de mentionner que le code est O (n ^ 2)
la source
Node.JS
C'est si simple, n'importe quel programmeur pourrait le faire.
Nous devons d'abord changer le
hosts
fichier pour que la.com, .net, .org
carte soit127.0.0.1
.et le reste est Javascript de base que tout noob pourrait comprendre.
Ça y est :)
la source
string.split('/n');
de confondre l'étudiant théorique :).Rubis
Les chaînes de programmation sont en Einsteintanium. En tant que tels, ils sont extrêmement difficiles à diviser.
Heureusement pour vous, j'ai un doctorat en chimie ET en programmation, donc je peux vous aider.
Nous utiliserons du rubis pour cela.
C'est mal parce que:
la source
SplitStr
vousC ++
Grâce aux puissantes nouvelles fonctionnalités du langage de programmation C ++, cela peut être résolu facilement en utilisant la bibliothèque standard, n'oubliez pas de réinventer la roue .
Edit: Cette réponse tente évidemment de créer quelque chose de stupidement complexe pour une tâche triviale et, ce faisant, a abusé d'autant d'outils que je le pouvais tout en étant capable d'écrire le code.
Voici quelques éléments à noter:
la source
C #
Il utilise la technologie de la récursivité pour transformer les nouvelles lignes en virgules. La chaîne CSV résultante peut être facilement divisée en un tableau.
la source
C ++
Semble entièrement crédible et manuel jusqu'à la dernière expression. C'est même correct, essayez simplement d'expliquer cela à votre professeur.
Il n'y a bien sûr aucune justification
std::for_each
, mais cela nous permet de mal utiliser un lambda. Cette lambda semble renvoyer quelque chose, mais en réalité, ce n'est pas le cas. L'opérateur ternaire est là juste pour les effets secondaires.la source
Bien! Ce problème est donc rendu très facile par l'utilisation de quelques fonctionnalités peu connues de python, y compris les instructions #define (elles les ont récemment portées depuis C ++) et l'enregistrement automatique des méthodes sur les classes intégrées.
C'est gentil?
Explication
... il y a une assez grande liste de pêche à la traîne ici.
En fait, le programme fonctionne (en Python 3.3.0 au moins, et en plus du problème d'entrée sur une seule ligne) car un tas de choses qui font qu'il ne fait pas ce qu'il dit se combinent pour le faire fonctionner réellement.
la source
Objectif LOLCODE
la source
ANSI C
Il s'agit d'une mission standard que nous avons tous accomplie. C'est la solition généralement acceptée.
Vous devez inclure la bibliothèque avec la fonction appropriée pour diviser et imprimer.
#include <stdio.h>
Créez la chaîne que vous souhaitez diviser:
const char * input = "First Line\nSecond Line\nThird Line\n";
notez comment j'ai utilisé leconst
mot - clé pour illustrer que printf n'a aucun moyen de modifier votre entrée. Ceci est important car vous souhaitez toujours conserver l'entrée utilisateur dans sa forme d'origine à des fins juridiques.printf("%s", input);
fait le fractionnement pour vous comme vous pouvez le voir dans la sortie de la console.getchar();
est juste une petite astuce supplémentaire pour garder la console persistante pendant que vous inspectez la sortie.L'entrée:
"First Line\nSecond Line\nThird Line\n"
Crée la sortie:
la source
Python
Nous pouvons utiliser de manière itérative la
find()
méthode de chaîne de Python pour diviser la chaîne à chaque nouvelle instance de ligne (notez que la chaîne d'entrée est codée en dur commeinput_str
, mais peut être remplacée par raw_input ()):En exécutant le script ci-dessus, nous obtenons la sortie attendue (notez que les espaces blancs de début et de fin sont cohérents avec le fractionnement de la chaîne à chaque nouvelle occurrence de ligne):
la source
PHP / GD
Le fractionnement des chaînes est une question très compliquée. Bien que nous ayons continué et fait une implémentation assez basique pour ce problème de devoirs si important.
Fonctionne sans aucune dépendance sur une version récente de PHP: quantité d'exemples limitée dans le code publié car nous avons une limite de caractères d'environ 40 000 caractères ici, ce qui ne correspond pas à une quantité décente de chaînes de démonstration.
Exemple de version:
http://codepad.viper-7.com/YnGvCn
Confirme exactement selon vos spécifications.
la source
Je ne veux pas être méchant, alors voici un morceau de code Python qui divise votre chaîne en morceaux. Cependant, comme vous n'avez pas spécifié où vous souhaitez le diviser, je vais simplement choisir des emplacements aléatoires. J'espère que ça vous va.
la source
Python
la source
Pour les langues qui prennent en charge l'expression régulière et dont la
split
fonction est facilement disponible, vous devez toujours l'utiliser pour fractionner une chaîne. Cela vous aide à éviter de réinventer la roue et à garder votre code court et doux. L'utilisation d'expressions régulières vous permet également de porter votre code dans une autre langue sans changer votre expression régulière.Mauvaise solution
Il y a cette solution évidente où vous divisez par
\n
ou\r\n
:Java
PHP
Cette solution est une ordure et ne doit jamais être utilisée. De nos jours, il est vain d'éviter Unicode, chaque programmeur devrait plutôt l'adopter et s'assurer que votre application est prête pour Unicode. Si vous envisagez uniquement
\n
ou\r\n
comme nouveau séparateur de ligne, vous écrivez un logiciel dans les années 90. Dans cet âge Unicode, vous devez considérer U + 0085, U + 2028, U + 2029 comme séparateur de ligne valide. Étant donné qu'Unicode est mis à jour de temps en temps, et qu'il faut généralement un certain temps avant de réaliser qu'il a été mis à jour, un nouveau séparateur de ligne peut être ajouté à Unicode. Ne vous inquiétez pas, car tous les moteurs d'expression régulière sont prêts pour Unicode et ils sont régulièrement mis à jour pour se conformer à la dernière norme Unicode. Donc, si vous utilisez un langage interprété, votre code sera à jour sans que vous ne fassiez quoi que ce soit.Solution recommandée
Pour diviser une chaîne par le terminateur de ligne et rester à jour avec l'évolution d'Unicode, fournissez l'expression régulière
^
et spécifiez leMULTILINE
mode.Par défaut,
^
ne correspond qu'au début de la chaîne. EnMULTILINE
mode, correspond^
également au début de la ligne, c'est-à-dire après un terminateur de ligne.Par exemple:
Java
PHP
Notez qu'il y a une entrée de chaîne vide supplémentaire devant, supprimez-la ou bouclez de l'index 1.
Explication
À première vue, cela semble être une bonne réponse avec une solution (quelque peu) fonctionnelle, associée à une explication et à une recommandation de codage des meilleures pratiques. Cependant, la solution elle-même est un troll ( "Je sais, j'utiliserai des expressions régulières." Maintenant, ils ont deux problèmes. ), Et le message entier est saupoudré d'informations subtilement erronées, ce qui va empoisonner tout débutant à la programmation.
MULTILINE
mode, le comportement de^
et$
dépend de la définition de "terminateur de ligne". Java considère\r\n
,\n
,\r
,\u0085
,\u2028
,\u2029
soit de fin de ligne, où la\r\n
séquence est considérée comme atomique. JavaScript considère\n
,\r
,\u2028
,\u2029
pour être fin de ligne. Ruby ne considère que\n
comme terminateur de ligne.split
La fonction peut avoir une sémantique différente dans différentes langues pour les cas d'angle. Python ne se divise pas sur les correspondances vides, Java supprime les chaînes vides de fin (sauf si vous spécifiez une limite négative), JavaScript ne se divise pas sur une correspondance de chaîne vide à l'index 0.la source
Script bash
Cela fractionne la chaîne par des sauts de ligne. Si vous faites écho à la
$new_string
, vous remarquerez qu'elle a remplacé la nouvelle ligne dans les séparateurs de tableaux.Exemple de sortie:
la source
Java
Cela ne lit pas à partir d'un fichier. Des expressions régulières sont utilisées. Le code suppose que la chaîne lue a le caractère «\ n» pour indiquer la nouvelle ligne. Les nombres 1, 2, 3, 4 sont utilisés pour indiquer la division.
la source
C #
la source
Vous ne spécifiez pas si la "nouvelle ligne" à laquelle vous souhaitez fractionner votre chaîne est sensible à la casse ou insensible. Je suppose insensible.
la source
Mec, c'est super facile à faire dans Powershell.
Obtenez simplement votre chaîne comme ceci:
Ensuite, bouclez sur ascii aléatoire jusqu'à ce que votre chaîne soit divisée en deux comme ceci:
finalement, vous devriez obtenir la chaîne fractionnée, que vous pouvez produire comme ceci:
Sortie:
la source
Php
Voici comment vous divisez la chaîne, ce n'était pas si simple?
Il ne vous reste plus qu'à écrire la fonction
Spliter()
la source
spécifique à bash
Il y a un excellent travail pour bash !
Oui, le fractionnement de la chaîne pourrait se faire de manière très simple:
Vous devez d'abord initialiser une variable que vous utiliserez pour stocker votre résultat divisé:
Maintenant que chaque ligne est délimitée par deux de séparateur, début ou fin de chaîne, vous aurez besoin d'une variable pour stocker la première
Ok, maintenant vous pouvez rechercher un séparateur et stocker vos lignes en utilisant une boucle . Comme bash ne pouvait pas fonctionner avec une valeur binaire, vous pouvez utiliser l'outil comme
od
pour travailler avec des valeurs hexadécimales, par exemple:Maintenant, nous avons une chaîne fractionnée stockée dans une variable
lines
:Que nous pourrions imprimer en utilisant:
Mettre tout cela dans un seul script:
Cela imprimera:
Bash moderne
Mais en utilisant l' implémentation bash moderne , vous pouvez stocker des caractères de contrôle comme newline dans une variable, et même les tester:
golf bash
Mais si vous ne vous souciez pas de la lisibilité, vous pouvez écrire un script condensé comme:
Le script joué peut apparaître comme:
et donnera le même effet: La première chaîne divisée en ligne et les stocke dans un tableau nommé lignes . Et la deuxième ligne imprimera chaque membre du tableau '' lignes '', suivi d'une nouvelle ligne .
console bash + vt
Mais comme de nombreuses personnes utilisent une console de texte basée sur la norme ANSI VT , vous pouvez utiliser les comportements VT de votre console et réécrire ceci plus court:
donnera le même résultat.
la source