Minha tarefa de casa é pegar uma corda e dividi-la em pedaços a cada nova linha. Eu não tenho ideia do que fazer! Por favor ajude!
Nota: Esta é uma pergunta de controle de código . Por favor, não leve a sério a pergunta e / ou respostas. Mais informações aqui .
code-trolling
Turion
fonte
fonte
Respostas:
C
Problema complicado para uma classe de programação C inicial! Primeiro você precisa entender algumas noções básicas sobre esse assunto complicado.
Uma sequência é uma sequência composta apenas de caracteres . Isso significa que, para que os programadores indiquem uma coisa "invisível" (que não é um espaço, que conta como um personagem), é necessário usar uma sequência especial de caracteres de alguma forma para significar essa coisa invisível.
No Windows , a nova linha é uma sequência de dois caracteres na sequência: barra invertida n (ou a sequência
"\n"
)Nos Macs Linux ou OS / X , é uma sequência de quatro caracteres: barra invertida, n, barra invertida e, em seguida, r: (ou
"\n\r"
).(Nota histórica interessante: em Macintoshes mais antigos, havia uma sequência diferente de quatro caracteres: "\ r \ n" ... totalmente ao contrário de como o Unix fazia as coisas! A história toma caminhos estranhos.)
Pode parecer que o Linux é mais inútil que o Windows, mas na verdade é uma idéia melhor usar uma sequência mais longa. Como o Windows usa uma sequência tão curta, o tempo de execução do idioma C não pode imprimir as letras reais
\n
sem usar chamadas especiais do sistema. Geralmente, você pode fazer isso no Linux sem uma chamada do sistema (pode até imprimir\n\
ou\n\q
... qualquer coisa, menos\n\r
). Porém, como C é uma plataforma cruzada, ele aplica o menor denominador comum. Então você sempre estará vendo\n
em seu livro.(Nota: se você está se perguntando como estamos falando
\n
sem obter novas linhas sempre que o fizermos, o StackOverflow é escrito quase inteiramente em HTML ... não em C. Portanto, é muito mais moderno. Muitos desses aspectos antigos de C são sendo abordado por coisas que você já deve ter ouvido falar, como CLANG e LLVM.)Mas voltando ao que estamos trabalhando. Vamos imaginar uma string com três peças e duas novas linhas, como:
Você pode ver que o comprimento dessa string é 3 + 2 + 3 + 2 + 3 = 13. Portanto, é necessário fazer um buffer de tamanho 13 para isso, e os programadores C sempre adicionam um ao tamanho de suas matrizes para garantir a segurança. Portanto, faça seu buffer e copie a string para ele:
Agora, o que você precisa fazer é procurar o padrão de dois caracteres que representa a nova linha. Você não pode procurar apenas uma barra invertida. Como o C é usado bastante para a divisão de cadeias de caracteres, ocorrerá um erro se você tentar. Você pode ver isso se tentar escrever:
(Nota: existe uma configuração no compilador para se você estiver escrevendo um programa que apenas procure barras invertidas. Mas isso é extremamente incomum; as barras invertidas são muito raramente usadas, e é por isso que foram escolhidas para esse fim. Não vamos mudar isso ligar.)
Então, vamos fazer o padrão que realmente queremos, assim:
Quando queremos comparar duas strings de um certo comprimento, usamos
strncmp
. Ele compara um certo número de caracteres de uma sequência potencialmente maior e informa se eles correspondem ou não. Entãostrncmp("\nA", "\nB", 2)
retorna 1 (verdadeiro). Isso ocorre mesmo que as strings não sejam inteiramente iguais ao longo de três ... mas porque apenas dois caracteres são necessários.Então, vamos percorrer nosso buffer, um caractere de cada vez, procurando a correspondência de dois caracteres com o nosso padrão. Sempre que encontrarmos uma sequência de dois caracteres de uma barra invertida seguida por um n, usaremos a chamada de sistema muito especial (ou "syscall")
putc
para colocar um tipo especial de caractere: código ASCII 10 , para obter uma nova linha física .A saída deste programa é o resultado desejado ... a string dividida!
\t
é para \ trolling ......
...
...
fonte
Parabéns! Sua string agora deve ser dividida. Caso contrário, repita as etapas até que esteja. Se você repetiu as etapas algumas vezes e a corda não estiver até dividir, tente usar uma tesoura mais afiada.
AVISO LEGAL: Eu não sou responsável por qualquer dano aplicado a você durante o processo.
fonte
Python
Eu me sinto tão mal que você recebeu uma pergunta tão óbvia como lição de casa. Uma linguagem altamente avançada, como Python, torna isso um simples alinhador duplo:
Por favor, vote e aceite.
fonte
C
Em C é realmente fácil:
Chame assim:
Exemplo de trabalho:
http://codepad.org/GBHdz2MR
Por que é mau:
printf
função de dividir as cordas#define
(e até quem entende )fonte
Isso pode ser feito em algumas linhas de código pelo seguinte algoritmo simples:
No entanto, isso é um desperdício. Este é essencialmente um algoritmo de busca linear , que possui complexidade de tempo linear (O (n)). Vou mostrar uma técnica mais avançada: pesquisa binária . A pesquisa binária é muito mais eficiente que a pesquisa linear: possui apenas complexidade de tempo logarítmica (O (log (n)). Isso significa que, se o espaço de pesquisa for duas vezes maior, o tempo de pesquisa não dobrará, apenas aumentará em uma quantia fixa!
O código para pesquisa binária é um pouco mais complicado, porque usa as técnicas avançadas de recursão e divisão e conquista . Mas definitivamente vale a pena pelo benefício de desempenho. Se você enviar isso, espero que receba crédito extra.
A essência do algoritmo é esta:
Você não especificou uma linguagem, então eu a escrevi em Python. No mundo real, é claro, as pessoas não escrevem em Python - use C ou C ++ (ou melhor ainda, linguagem assembly) para obter um desempenho real. Não se preocupe se você não entender o que todo o código está fazendo - isso é definitivamente algo avançado.
É claro que todas as declarações sobre desempenho são falsas. O algoritmo "simples" pode ser linear ou quadrático, dependendo de como você o interpreta. O algoritmo “avançado” é Θ (n × log (n)) (bastante próximo do linear na prática), mas garoto, é a constante multiplicativa alta devido à reconstrução incessante da lista (que a implementação faz um pouco do seu caminho para promover )
O estilo Python, o estilo de comentários, as declarações sobre escolhas de idioma e quase tudo o mais neste post também não refletem minha opinião ou hábitos.
fonte
Visual básico
A
IO
mônada tem uma função para fazer isso!fonte
C ++
std::strstream
strstream
std::
prefixofonte
Python 3 (limpo e arrumado)
fonte
#define
? ;-)Rubi
Bem, você vê primeiro, você precisa transformá-lo em uma matriz como esta
Agora você deve colocar os elementos como strings
Ah, também remova a última vírgula
Opa esqueci, você deve colocar os colchetes para ser uma matriz
Agora basta usar a corda e pronto
Maldade:
split
eval
'
ou,
fonte
Lua
Exemplo de entrada:
"Hello\nworld\nstuff"
Saída:
{"pieces","pieces","pieces","pieces","pieces","pieces"}
Ah, e eu esqueci de mencionar que o código é O (n ^ 2)
fonte
Node.JS
Isso é tão simples que qualquer programador poderia fazer isso.
Primeiro temos que mudar o
hosts
arquivo para que.com, .net, .org
mapa para127.0.0.1
.e o resto é Javascript básico que qualquer noob poderia entender.
Lá vai você :)
fonte
string.split('/n');
para confundir o aluno teórico :).Rubi
Strings na programação são feitas de Einsteintanium. Como tal, são extremamente difíceis de dividir.
Felizmente para você, eu tenho um doutorado em química e programação, para que eu possa ajudar.
Nós estaremos usando ruby para isso.
Isso é mau porque:
fonte
SplitStr
sempre divide por novas linhas não importa o que o argumento é, não tenho certeza se intencionalC ++
Graças aos novos e poderosos recursos da linguagem de programação C ++, isso pode ser resolvido com facilidade usando a biblioteca padrão, lembre-se de não reinventar a roda .
Edit: Esta resposta, obviamente, apenas tenta criar algo estupidamente complexo para uma tarefa trivial e, ao fazer isso, abusou do máximo de ferramentas possível enquanto ainda conseguia escrever o código.
Aqui estão algumas coisas a serem observadas:
fonte
C #
Isso usa a tecnologia de recursão para transformar as novas linhas em vírgulas. A sequência CSV resultante pode ser facilmente dividida em uma matriz.
fonte
C ++
Parece totalmente crível e didático até a última expressão. É até correto, tente explicar isso ao seu professor.
Obviamente, não há justificativa para isso
std::for_each
, mas isso nos permite usar mal um lambda. Esse lambda parece estar retornando algo, mas na realidade não. O operador ternário está lá apenas para os efeitos colaterais.fonte
Bem! Portanto, esse problema é facilitado pelo uso de alguns recursos pouco conhecidos do python, incluindo instruções #define (recentemente portadas pelo C ++) e pelo registro automático de métodos nas classes internas.
Quão legal é isso?
Explicação
... há uma lista bastante grande de corrico aqui.
Na verdade, o programa funciona (pelo menos no Python 3.3.0, e além do problema de entrada de linha única), já que várias coisas que fazem com que ele não faça o que diz se combinam para fazê-lo realmente funcionar.
fonte
Objetivo LOLCODE
fonte
ANSI C
Essa é uma tarefa padrão que todos nós fizemos. Esta é a solição geralmente aceita.
Você precisa incluir a biblioteca com a função correta para dividir e imprimir.
#include <stdio.h>
Crie a string que você deseja dividir:
const char * input = "First Line\nSecond Line\nThird Line\n";
Observe como usei aconst
palavra-chave para ilustrar que printf não tem como alterar sua entrada. Isso é importante, pois você sempre deseja preservar a entrada do usuário em sua forma original para fins legais.printf("%s", input);
faz a divisão para você, como você pode ver na saída do console.getchar();
é apenas um pequeno truque extra para manter o console persistente enquanto você inspeciona a saída.A entrada:
"First Line\nSecond Line\nThird Line\n"
Cria a saída:
fonte
Python
Podemos usar iterativamente o
find()
método de string do Python para dividir a string em cada nova instância de linha (observe que a string de entrada é codificada comoinput_str
, mas pode ser substituída por raw_input ()):Executando o script acima, obtemos a saída esperada (observe que os espaços em branco à esquerda e à direita são consistentes com a divisão da string a cada nova ocorrência de linha):
fonte
PHP / GD
A divisão de strings é uma questão muito complicada. Embora tenhamos feito uma implementação bastante básica para esta questão tão importante da lição de casa.
É executado sem dependências em uma versão recente do PHP: Quantidade de exemplos limitados no código publicado, pois temos um limite de caracteres de cerca de 40.000 caracteres aqui que não se encaixa em uma quantidade razoável de seqüências de demonstração.
Versão de exemplo:
http://codepad.viper-7.com/YnGvCn
Confirma exatamente suas especificações.
fonte
Eu não quero ser mau, então aqui está um pedaço de código Python que divide sua string em pedaços. No entanto, como você não especificou onde deseja que ela seja dividida, selecionarei locais aleatórios. Espero que esteja tudo bem com você.
fonte
Python
fonte
Para idiomas que oferecem suporte à expressão regular e tem
split
função prontamente disponível, você deve sempre usá-lo para dividir uma string. Isso ajuda a evitar a reinvenção da roda e a manter seu código curto e agradável. O uso de expressão regular também permite portar seu código para outro idioma sem alterar sua expressão regular.Solução ruim
Existe esta solução óbvia em que você divide
\n
ou\r\n
:Java
PHP
Essa solução é lixo e nunca deve ser usada. Hoje em dia, é inútil evitar o Unicode, mas todo programador deve adotá-lo e garantir que seu aplicativo esteja pronto para Unicode. Se você considera apenas
\n
ou\r\n
como um novo separador de linhas, está escrevendo um software nos anos 90. Nesta era Unicode, você deve considerar U + 0085, U + 2028, U + 2029 como separador de linha válido. Como o Unicode é atualizado de vez em quando, e geralmente leva algum tempo para você perceber que foi atualizado, pode haver um novo separador de linhas adicionado ao Unicode. Não se preocupe, porque todos os mecanismos de expressão regular estão prontos para Unicode e são atualizados regularmente para estar em conformidade com o padrão Unicode mais recente. Portanto, se você estiver usando uma linguagem interpretada, seu código estará atualizado sem você fazer nada.Solução recomendada
Para dividir uma sequência pelo terminador de linha e manter-se atualizado com a evolução do Unicode, forneça o regex
^
e especifique oMULTILINE
modo.Por padrão,
^
corresponde apenas ao início da string. NoMULTILINE
modo,^
também corresponde ao início da linha, ou seja, após um terminador de linha.Por exemplo:
Java
PHP
Observe que há uma entrada de seqüência vazia extra na frente, basta removê-la ou fazer um loop do índice 1.
Explicação
À primeira vista, isso parece uma boa resposta com uma solução (um tanto) funcional, juntamente com uma explicação com algumas recomendações de práticas recomendadas de codificação. No entanto, a solução em si é um troll ( "Eu sei, usarei expressões regulares." Agora eles têm dois problemas. ), E todo o post está repleto de informações sutilmente erradas, o que envenenará qualquer iniciante em programação.
MULTILINE
modo, o comportamento de^
e$
depende da definição de "terminador de linha". Java considera\r\n
,\n
,\r
,\u0085
,\u2028
,\u2029
para ser terminador de linha, onde\r\n
seqüência é considerada atômica. JavaScript considera\n
,\r
,\u2028
,\u2029
para ser terminadores de linha. Ruby considera apenas o\n
terminador de linha.split
A função pode ter semântica diferente em idiomas diferentes para casos de canto. O Python não se divide em correspondências vazias, o Java remove seqüências de caracteres vazias à direita (a menos que você especifique um limite negativo), o JavaScript não se divide em uma correspondência de sequência vazia no índice 0.fonte
Script Bash
Isso divide a string por novas linhas. Se você repetir
$new_string
, notará que ela substituiu a nova linha nos separadores de matriz.Saída de amostra:
fonte
Java
Isso não lê de um arquivo. Expressões regulares são usadas. O código assume que a string lida possui o caractere '\ n' para indicar a nova linha. Os números 1,2,3,4 são usados para indicar a divisão.
fonte
C #
fonte
Você não especifica se a "nova linha" na qual deseja dividir sua sequência é sensível a maiúsculas ou minúsculas. Eu assumo insensível.
fonte
Cara, isso é super fácil de fazer em Powershell.
Apenas pegue sua string assim:
Em seguida, faça um loop sobre ascii aleatórios até que sua string seja dividida em duas como esta:
eventualmente, você deve obter a cadeia de caracteres dividida, que você pode gerar assim:
Saída:
fonte
Php
Aqui está como você divide a string. Não foi tão fácil?
Tudo o que você precisa fazer agora é escrever a função
Spliter()
fonte
bash específico
Há um ótimo trabalho para o bash !
Sim, a divisão de strings poderia ser feita de maneira realmente simples:
Primeiro, você precisa inicializar uma variável que usará para armazenar seu resultado dividido:
Agora, como cada linha é delimitada por dois do separador, início ou fim da string, você precisará de uma variável para armazenar a primeira
Ok, agora você pode procurar o separador e armazenar suas linhas usando um loop . Como o bash não pode funcionar com valor binário, você pode usar a ferramenta como
od
para trabalhar com valores hexadecimais, como exemplo:Agora, temos uma string dividida armazenada na variável
lines
:Que poderíamos imprimir usando:
Colocando tudo isso em um script:
Isso imprimirá:
Festa moderna
Mas, usando a implementação moderna do bash , você pode armazenar caracteres de controle como newline em variáveis e até testá-los:
bash golf
Mas se você não se importa com a legibilidade, pode escrever um script condensado como:
O script golfed pode aparecer como:
e dará o mesmo efeito: A primeira linha divide a sequência e as armazena em uma matriz denominada linhas . E a segunda linha imprimirá cada membro da matriz '' linhas '', seguido por uma nova linha .
console bash + vt
Porém, como muitas pessoas usam o console de texto com base no padrão ANSI VT , você pode usar os comportamentos de VT do seu console e escrever isso mais rapidamente novamente:
dará o mesmo resultado.
fonte