Mi tarea es tomar una cuerda y dividirla en pedazos en cada nueva línea. ¡No tengo ni idea de qué hacer! ¡Por favor ayuda!
Nota: Esta es una pregunta de arrastre de código . No tome en serio la pregunta y / o las respuestas. Más información aquí .
code-trolling
Turion
fuente
fuente
Respuestas:
do
¡Problema complicado para una clase de programación C inicial! Primero tienes que entender algunos conceptos básicos sobre este tema complicado.
Una cadena es una secuencia compuesta solo de caracteres . Esto significa que para que los programadores indiquen una cosa "invisible" (que no es un espacio, que cuenta como un personaje), debe usar una secuencia especial de caracteres de alguna manera para significar esa cosa invisible.
En Windows , la nueva línea es una secuencia de dos caracteres en la cadena: barra diagonal inversa yn (o la cadena
"\n"
)En Linux o Mac OS / X , es una secuencia de cuatro caracteres: barra invertida, n, barra invertida y luego r: (o
"\n\r"
).(Nota histórica interesante: en Macintosh anteriores era una secuencia diferente de cuatro caracteres: "\ r \ n" ... totalmente al revés de cómo Unix hizo las cosas. La historia toma caminos extraños).
Puede parecer que Linux es más derrochador que Windows, pero en realidad es una mejor idea usar una secuencia más larga. Como Windows usa una secuencia tan corta, el tiempo de ejecución del lenguaje C no puede imprimir las letras reales
\n
sin usar llamadas especiales del sistema. Por lo general, puede hacerlo en Linux sin una llamada al sistema (incluso puede imprimir\n\
o\n\q
... cualquier cosa menos\n\r
). Pero dado que C está destinado a ser multiplataforma, impone el mínimo común denominador. Entonces siempre lo verás\n
en tu libro.(Nota: si se pregunta cómo estamos hablando
\n
sin obtener nuevas líneas cada vez que lo hacemos, StackOverflow está escrito casi en su totalidad en HTML ... no C. Por lo tanto, es mucho más moderno. Muchos de estos viejos aspectos de C son ser abordado por cosas que quizás haya escuchado, como CLANG y LLVM).Pero volvamos a lo que estamos trabajando. Imaginemos una cadena con tres piezas y dos líneas nuevas, como:
Puede ver que la longitud de esa cadena es 3 + 2 + 3 + 2 + 3 = 13. Por lo tanto, debe crear un búfer de longitud 13, y los programadores de C siempre agregan uno al tamaño de sus matrices para estar seguros. Así que crea tu búfer y copia la cadena en él:
Ahora lo que tiene que hacer es buscar ese patrón de dos caracteres que representa la nueva línea. No se le permite buscar solo una barra invertida. Debido a que C se usa para dividir cadenas bastante, te dará un error si lo intentas. Puedes ver esto si intentas escribir:
(Nota: hay una configuración en el compilador para si está escribiendo un programa que solo busca barras invertidas. Pero eso es extremadamente poco común; las barras invertidas se usan muy raramente, por eso se eligieron para este propósito. encender.)
Así que hagamos el patrón que realmente queremos, así:
Cuando queremos comparar dos cadenas que son de cierta longitud, utilizamos
strncmp
. Compara una cierta cantidad de caracteres de una cadena potencialmente más grande y le dice si coinciden o no. Entoncesstrncmp("\nA", "\nB", 2)
devuelve 1 (verdadero). Esto es a pesar de que las cadenas no son del todo iguales en la longitud de tres ... sino porque solo se necesitan dos caracteres.Entonces, recorramos nuestro búfer, un carácter a la vez, buscando la coincidencia de dos caracteres con nuestro patrón. Cada vez que encontremos una secuencia de dos caracteres de una barra invertida seguida de una n, usaremos la llamada muy especial del sistema (o "syscall")
putc
para emitir un tipo especial de carácter: código ASCII 10 , para obtener una nueva línea física .La salida de este programa es el resultado deseado ... ¡la cadena se dividió!
\t
es para \ trolling ......
...
...
fuente
¡Felicidades! Su cadena ahora debe estar dividida. Si no, repita los pasos hasta que lo sea. Si ha repetido los pasos un par de veces y la cuerda no está dividida, intente usar una tijera más afilada.
DESCARGO DE RESPONSABILIDAD: No soy responsable de ningún daño que se le haya aplicado durante el proceso.
fuente
Pitón
Me siento tan mal que te hayan hecho una pregunta capciosa tan obvia como la tarea. Un lenguaje muy avanzado como Python hace que este sea un simple dos líneas:
Por favor vota y acepta.
fuente
do
En C es realmente fácil:
Llámalo así:
Ejemplo de trabajo:
http://codepad.org/GBHdz2MR
Por qué es malo:
printf
función para dividir las cadenas.#define
(e incluso a aquellos que sí lo entiendan )fuente
Esto se puede hacer en unas pocas líneas de código mediante el siguiente algoritmo simple:
Sin embargo, esto es un desperdicio. Esto es esencialmente un algoritmo de búsqueda lineal , que tiene una complejidad de tiempo lineal (O (n)). Te dejaré entrar en una técnica más avanzada: búsqueda binaria . La búsqueda binaria es mucho más eficiente que la búsqueda lineal: solo tiene una complejidad de tiempo logarítmico (O (log (n)). Esto significa que si el espacio de búsqueda es el doble, el tiempo de búsqueda no se duplica, solo aumenta en una cantidad fija!
El código para la búsqueda binaria es un poco más complicado, ya que utiliza las técnicas avanzadas de recursión y divide y vencerás . Pero definitivamente vale la pena por el beneficio de rendimiento. Si envía eso, espero que obtenga crédito adicional.
La esencia del algoritmo es esta:
No especificó un idioma, así que lo escribí en Python. En el mundo real, por supuesto, la gente no escribe en Python: use C o C ++ (o incluso mejor, lenguaje ensamblador) para un rendimiento real. No se preocupe si no comprende lo que está haciendo todo el código; esto definitivamente es algo avanzado.
Por supuesto, todas las declaraciones sobre el rendimiento son falsas. El algoritmo "simple" puede ser lineal o cuadrático dependiendo de cómo lo interprete. El algoritmo "avanzado" es Θ (n × log (n)) (bastante cercano a lineal en la práctica), pero vaya, es la constante multiplicativa alta debido a la reconstrucción de la lista incesante (que la implementación se sale de su camino para fomentar )
El estilo de Python, el estilo de comentarios, las declaraciones sobre las opciones de idioma y casi todo lo demás en esta publicación tampoco reflejan mi opinión o hábitos reales.
fuente
Visual Basic
¡La
IO
mónada tiene una función para hacer eso!fuente
C ++
std::strstream
strstream
std::
prefijofuente
Python 3 (ordenado y limpio)
fuente
#define
s? ;-)Rubí
Bueno, primero ves que tienes que convertirlo en una matriz como esta
Ahora debes poner los elementos como cadenas
Oh, también quita esa última coma
Ups olvidado, debes poner los corchetes para ser una matriz
Ahora solo usa la cadena y listo
Maldad:
split
eval
'
o,
fuente
Lua
Ejemplo de entrada:
"Hello\nworld\nstuff"
Salida:
{"pieces","pieces","pieces","pieces","pieces","pieces"}
Ah, y olvidé mencionar que el código es O (n ^ 2)
fuente
Node.JS
Esto es tan simple que cualquier programador podría hacer esto.
Primero tenemos que cambiar el
hosts
archivo para que se.com, .net, .org
asigne a127.0.0.1
.y el resto es Javascript básico que cualquier novato podría entender.
Ahí tienes :)
fuente
string.split('/n');
confundir al estudiante teórico :).Rubí
Las cadenas en la programación están hechas de Einsteintanium. Como tal, son extremadamente difíciles de dividir.
Afortunadamente para ti, tengo un doctorado en química y programación, por lo que puedo ayudarte.
Usaremos ruby para esto.
Esto es malo porque:
fuente
SplitStr
siempre divide por saltos de línea no importa lo que el argumento es, no estoy seguro si intencionalC ++
Gracias a las nuevas y potentes funciones del lenguaje de programación C ++, esto se puede resolver con facilidad utilizando la biblioteca estándar, recuerde no reinventar la rueda .
Editar: esta respuesta obviamente solo intenta crear algo estúpidamente complejo para una tarea trivial, y al hacerlo abusó de tantas herramientas como pude mientras aún podía escribir el código.
Aquí hay algunas cosas a tener en cuenta:
fuente
DO#
Utiliza la tecnología de recursión para transformar las nuevas líneas en comas. La cadena CSV resultante se puede dividir fácilmente en una matriz.
fuente
C ++
Parece completamente creíble y libro de texto hasta la última expresión. Incluso es correcto, solo trata de explicarle esto a tu maestro.
Por supuesto, no hay justificación para ello
std::for_each
, pero nos permite usar mal una lambda. Parece que esa lambda está devolviendo algo, pero en realidad no lo hace. El operador ternario está ahí solo para los efectos secundarios.fuente
¡Bien! Por lo tanto, este problema se hace muy fácil mediante el uso de algunas características poco conocidas de Python, incluidas las declaraciones #define (recientemente las transfirieron desde C ++) y el registro automático de métodos en clases integradas.
Que lindo es eso?
Explicación
... hay una lista bastante grande de los curricán aquí.
En realidad, el programa funciona (al menos en Python 3.3.0, y además del problema de entrada de una sola línea) ya que un montón de cosas que hacen que no haga lo que dice se combinan para que realmente funcione.
fuente
Objetivo LOLCODE
fuente
ANSI C
Esta es una tarea estándar que todos hemos hecho. Esta es la solución generalmente aceptada.
Debe incluir la biblioteca con la función correcta para dividir e imprimir.
#include <stdio.h>
Cree la cadena que desea dividir:
const char * input = "First Line\nSecond Line\nThird Line\n";
observe cómo utilicé laconst
palabra clave para ilustrar que printf no tiene medios para cambiar su entrada. Esto es importante ya que siempre desea preservar la entrada del usuario en su forma original para fines legales.printf("%s", input);
realiza la división por ti como puedes ver en la salida de la consola.getchar();
es solo un pequeño truco adicional para mantener la consola persistente mientras inspecciona la salida.La entrada:
"First Line\nSecond Line\nThird Line\n"
Crea la salida:
fuente
Pitón
Podemos usar iterativamente el
find()
método de cadena de Python para dividir la cadena en cada nueva instancia de línea (tenga en cuenta que la cadena de entrada está codificada comoinput_str
, pero se puede reemplazar con raw_input ()):Al ejecutar el script anterior, obtenemos el resultado esperado (tenga en cuenta que tanto el espacio en blanco inicial como el final son consistentes con la división de la cadena en cada aparición de línea nueva):
fuente
PHP / GD
Dividir cadenas es un asunto muy complicado. Aunque continuamos e hicimos una implementación bastante básica para este problema de tarea tan importante.
Se ejecuta sin dependencias en una versión reciente de PHP: Cantidad de ejemplos limitados en el código publicado ya que aquí tenemos un límite de caracteres de aproximadamente 40,000 caracteres que no se ajusta a una cantidad decente de cadenas de demostración.
Versión de ejemplo:
http://codepad.viper-7.com/YnGvCn
Confirma exactamente a sus especificaciones.
fuente
No quiero ser malo, así que aquí hay una pieza de código Python que divide tu cadena en pedazos. Sin embargo, dado que no especificó dónde desea que se divida, solo elegiré ubicaciones aleatorias. Espero que estés bien contigo.
fuente
Pitón
fuente
Para lenguajes que admiten expresiones regulares y tienen
split
funciones disponibles, siempre debe usarlo para dividir una cadena. Esto le ayuda a evitar reinventar la rueda y mantener su código corto y dulce. El uso de expresiones regulares también le permite portar su código a otro idioma sin cambiar su expresión regular.Mala solución
Existe esta solución obvia en la que se divide por
\n
o\r\n
:Java
PHP
Esa solución es basura y nunca debe usarse. En la actualidad, es inútil evitar Unicode, más bien todos los programadores deberían adoptarlo y asegurarse de que su aplicación esté lista para Unicode. Si solo consideras
\n
o\r\n
como un nuevo separador de línea, está escribiendo software en los años 90. En esta era Unicode, debe considerar U + 0085, U + 2028, U + 2029 como un separador de línea válido. Dado que Unicode se actualiza de vez en cuando, y generalmente toma algún tiempo antes de que se dé cuenta de que se ha actualizado, podría agregarse un nuevo separador de línea a Unicode. No se preocupe, porque todos los motores de expresión regular están listos para Unicode, y se actualizan regularmente para cumplir con el último estándar de Unicode. Entonces, si está utilizando un lenguaje interpretado, su código estará actualizado sin que usted haga nada.Solución recomendada
Para dividir una cadena por el terminador de línea, y mantenerse actualizado con la evolución de Unicode, proporcione la expresión regular
^
y especifiqueMULTILINE
modo.Por defecto,
^
solo coincide con el comienzo de la cadena. EnMULTILINE
modo,^
también coincide con el comienzo de la línea, es decir, después de un terminador de línea.Por ejemplo:
Java
PHP
Tenga en cuenta que hay una entrada de cadena vacía adicional al frente, simplemente elimínela o repítela del índice 1.
Explicación
A primera vista, esto parece una buena respuesta con una solución (algo) funcional, junto con una explicación con algunas recomendaciones de codificación de mejores prácticas. Sin embargo, la solución en sí es un troll ( "Lo sé, usaré expresiones regulares". Ahora tienen dos problemas ), y toda la publicación está salpicada de información sutilmente incorrecta, lo que envenena a cualquier novato en la programación.
MULTILINE
modo, el comportamiento de^
y$
depende de la definición de "terminador de línea". Java considera\r\n
,\n
,\r
,\u0085
,\u2028
,\u2029
sea terminador de línea, donde\r\n
se considera atómica secuencia. JavaScript considera\n
,\r
,\u2028
,\u2029
sea terminaciones de línea. Ruby considera que solo\n
es un terminador de línea.split
La función puede tener una semántica diferente en diferentes idiomas para casos de esquina. Python no se divide en coincidencias vacías, Java elimina las cadenas vacías finales (a menos que especifique un límite negativo), JavaScript no se divide en una coincidencia de cadenas vacía en el índice 0.fuente
Guión Bash
Esto divide la cadena por nuevas líneas. Si repite el
$new_string
, notará que reemplazó la nueva línea en separadores de matriz.Salida de muestra:
fuente
Java
Esto no lee de un archivo. Se utilizan expresiones regulares. El código asume que la cadena de lectura tiene el carácter '\ n' para indicar la nueva línea. Los números 1,2,3,4 se usan para indicar la división.
fuente
DO#
fuente
No especifica si la "nueva línea" en la que desea dividir su cadena es sensible a mayúsculas o minúsculas. Asumo insensible.
fuente
Amigo, esto es muy fácil de hacer en Powershell.
Simplemente obtenga su cadena de esta manera:
Luego recorra ascii al azar hasta que tenga su cadena dividida en dos como esta:
finalmente, debería obtener la cadena dividida, que puede generar de esta manera:
Salida:
fuente
Php
Así es como se divide la cadena. ¿No fue tan fácil?
Todo lo que tienes que hacer ahora es escribir la función
Spliter()
fuente
golpe específico
Hay un gran trabajo para bash !
Sí, dividir la cadena podría hacerse de una manera muy simple:
Primero debe inicializar una variable que usará para almacenar su resultado dividido:
Ahora, como cada línea está delimitada por dos separadores, principio o final de cadena, necesitará una variable para almacenar la primera.
Ok, ahora puedes buscar un separador y almacenar tus líneas usando un bucle . Como bash no puede funcionar con valores binarios, puede usar herramientas como
od
para trabajar con valores hexadecimales, por ejemplo:Ahora, tenemos una cadena dividida almacenada en variable
lines
:Que podríamos imprimir usando:
Poniendo todo esto en un script:
Esto imprimirá:
Fiesta moderna
Pero utilizando la implementación moderna de bash , puede almacenar caracteres de control como newline en variables e incluso probarlos:
bash golf
Pero si no le importa la legibilidad, podría escribir un guión condensado como:
El script de golf puede aparecer como:
y dará el mismo efecto: la primera línea divide la cadena y la almacena en una matriz llamada líneas . Y la segunda línea imprimirá cada miembro de la matriz '' líneas '', seguido de una nueva línea .
consola bash + vt
Pero como muchas personas usan la consola de texto basada en el estándar ANSI VT , podría usar los comportamientos de VT de su consola y escribir esto de nuevo más corto:
dará el mismo resultado.
fuente