2009-09-15 19 views
26

Je suis en train d'y arriver:Matlab troubles de la fonction strcat avec des espaces

strcat('red ', 'yellow ', 'white ') 

Je pensais voir « jaune rouge », cependant, je vois « redyellowwhite » sur la sortie de commande. Que faut-il faire pour s'assurer que les espaces sont correctement concaténés? Merci d'avance.

+3

@ # $ @! # $ @! une autre incohérence entre Matlab et C.> :( –

+0

Solution de contournement rapide: 'cstrcat (" he "," l "," lo ")', préserve les espaces Source: http://stackoverflow.com/a/14025999/ 445131 –

+0

Il y a tellement de décisions de conception idiotes dans Matlab, mais je ne m'attendais pas à quelque chose d'aussi simple que cela soit aussi un problème! – houbysoft

Répondre

20

Sur la page d'aide Matlab pour strcat.

« strcat ne tient pas compte de fuite des caractères blancs ASCII et omet tous les caractères de la sortie caractères blancs en ASCII sont l'espace, saut de ligne, retour chariot, onglet, onglet vertical ou syntaxe de concaténation [s1 s2 s3 ...] pour préserver les espaces de fin, strcat n'ignore pas les entrées qui sont des tableaux de chaînes de chaînes. "

20

Bien que STRCAT ignore à la fin espace blanc, il conserve encore menant espace blanc. Essayez ceci:

strcat('red',' yellow',' white') 

Alternativement, vous pouvez simplement utiliser la syntaxe de concaténation:

['red ' 'yellow ' 'white '] 
1

ou vous pouvez dire:

str = sprintf('%s%s%s', 'red ', 'yellow ', 'white ') 
11

Vous pouvez protéger arrière espaces dans strcat() ou similaire fonctionne en le mettant dans une cellule.

str = strcat({'red '}, {'yellow '}, {'white '}) 
str = str{1} 

Pas très utile dans cet exemple de base. Mais si vous finissez par faire des opérations "vectorisées" sur les cordes, c'est pratique. La concaténation régulière de tableau ne fait pas la concaténation 1-à-plusieurs que strcat fait. Coller 'my' dans une cellule même s'il s'agit d'une seule chaîne préservera les espaces. Notez que vous devez utiliser la forme {} au lieu d'appeler cellstr(), qui supprimera elle-même les espaces de fin. Tout cela est probablement dû au fait que Matlab a deux formes de représentation des listes de chaînes: en tant que tableau de cellules, où tout espace est significatif, et en tant que tableau de caractères bidimensionnel, chaque ligne étant traitée comme une chaîne, et les espaces de fin ignorés. La forme de cellule ressemble le plus à des chaînes en Java et C; la forme de caractère 2-D peut être plus efficace en mémoire si vous avez plusieurs chaînes de longueur similaire. Les fonctions de manipulation de chaînes de Matlab sont polymorphes sur les deux représentations et présentent parfois des différences de ce type. Un caractère littéral comme 'foo' est un cas dégénéré à une corde de la forme de caractère 2D, et les fonctions de Matlab le traitent comme tel.

+1

Super, ça m'a aidé quand je voulais concaténer plusieurs tableaux de cellules avec un caractère '' ''': 'dateTime {:} = strcat (date, {' '}, heure)' – quazgar

+0

Cela m'a aidé aussi à préserver les espaces . Bon truc à savoir. BTW, vous êtes très proche (si ce n'est déjà) à 1k pour le tag MATLAB. Félicitations au début pour obtenir l'or :) – rayryeng

+0

Bon conseil. Je cherchais juste ça. – chengvt

13

En fait, vous pouvez simplement utiliser le code ASCII de l'espace: 32. Ainsi, vous pouvez résoudre le problème comme celui-ci:

str = strcat('red', 32, 'yellow', 32, 'white'); 

vous obtiendrez str = 'red yellow white'.

+2

Wow, drôle que cela fonctionne, même si 'strcat ('red', '', 'yellow', '', 'white')' supprime les espaces ... –