Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   ¿como unir cadenas en C y en C++? (https://www.clubdelphi.com/foros/showthread.php?t=78910)

JXJ 24-05-2012 17:44:48

¿como unir cadenas en C y en C++?
 
hola.


tengo una duda que no logro entender.

en delphi si quiero unir cadenas uso
Código Delphi [-]
var
  cadenafinal :string;
begin
     cadenafinal  := 'valor uno';
     cadenafinal := cadenafinal  + 'valor 2';
     cadenafinal := cadenafinal  + 'valor 3';
    cadenafinal := cadenafinal  + 'valor 4';

memo1.lines.add(cadenafinal ) ;
end;

y en el memo obtengo

valor uno valor 2 valor 3 valor 4


en C y en C++ como se hace lo mismo??

no entiendo .. como


gracias.

Casimiro Notevi 24-05-2012 18:29:28

Para poder usar estas funciones tenemos que incluir la cabecera: string.h
con el primero:
Código:

fscanf(archivo, "%s", palabra);
largo = strlen(palabra);
palabra[largo-1] = '\0'; //con esto terminas la variable palabra.
strcat(frase, palabra);

si quieres usar sprintf hazlo así:
Código:

fscanf(archivo, "%s", palabra);
largo = strlen(palabra);
palabra[largo-1] = '\0'; //con esto terminas la variable palabra.
sprintf(frase, "%s ", palabra);

no lo he probado pero creo que asi deberia funcionar.

Casimiro Notevi 24-05-2012 18:43:09

C++
strcat(): Concatenar cadenas
Sintaxis: char *strcat(char *dest, const char *src);
strcat agrega la cadena src a dest, la función termina hasta haber encontrado en src el caracter de terminación null.
Código:

char  nombre[]  = "Oscar E.";
char  copia[80] = " Palacios";
strcat(copia, nombre);
cout  << copia << endl;


JXJ 24-05-2012 19:04:32

hoo

Gracias.
Casimiro Notevi

estilo delphi es fabuloso.. en c au no me acostumbro

escafandra 25-05-2012 00:44:27

Existen muchas formas en C de concatenar cadenas. La mas usada es strcat como apunta Casimiro.
En C las cadenas se tratan a bajo nivel. Una cadena no es otra cosa que un array de char que terminan en un valor nulo.

Pero en C++ tenemos clases para manejar cadenas. En el entorno de Builder tienes la clase String que funciona casi igual que lo que ves en delphi y las puedes sumar.

Código:

String Cadena = "uno, " + "dos";

Saludos.

JXJ 08-07-2016 09:35:09

Estoy usando c++ builder XE5 w32
y los componentes firedac para hacer consultas.

Sigo de novato en C++

por que en c++ no puedo hacer esto

Código:

  FDQuery1->Close();
  FDQuery1->SQL->Clear();
  FDQuery1->SQL->Add("SELECT * FROM EMPLOYEE ");
  FDQuery1->SQL->Add(" WHERE ");
  FDQuery1->SQL->Add(" FIRST_NAME = " + "'" + EditFName->Text + "'");


  Memo1->Text = FDQuery1->SQL->Text;

  FDQuery1->OpenOrExecute();

da el siguiente error

[bcc32 Error] FiredacConecta.cpp(129): E2085 Invalid pointer addition
Full parser context
FiredacConecta.cpp(124): parsing: void _fastcall TForm1::Button2Click(TObject *)

y si pasa asi.

Código:

  FDQuery1->Close();
  FDQuery1->SQL->Clear();
  FDQuery1->SQL->Add("SELECT * FROM EMPLOYEE ");
  FDQuery1->SQL->Add(" WHERE ");
  FDQuery1->SQL->Add(" FIRST_NAME = '" + EditFName->Text + "'");


  Memo1->Text = FDQuery1->SQL->Text;

  FDQuery1->OpenOrExecute();

Gracias

por su atencion :D

ecfisa 08-07-2016 10:46:56

Hola.

Es que en:
Código PHP:

FDQuery1->SQL->Add(" FIRST_NAME = " "'" ... 

estas intentando concatenar dos cadenas C mediante el operador '+'. C++ no sabe tu intención en ese punto (de que resulte un AnsiString) y dá el error. De ese modo, habría que concatenarla por los modos que te mencionaron antes.

A ver si ejemplificando queda mas claro:
Código PHP:

...
{
  
AnsiString h1 "hola ";
  
AnsiString m1 "mundo";
  
ShowMessage(h1 m1); // Correcto

  
charh2 "hola ";
  
charm2 "mundo";

  
ShowMessage(h2 m2);           // ¡Error!, que es similar a:
  
ShowMessage("hola " "mundo"); // (lo que también es un error)
  
  // Sin embargo, indicando el tipo a convertir ,
  // como en los modos siguientes evitas el error:
  
ShowMessage((AnsiString)h2 + (AnsiString)m2);  
  
ShowMessage((AnsiString)h2 m2);  //(m2 es promovida)

  
ShowMessage((AnsiString)"hola " +(AnsiString)"mundo");  
  
ShowMessage((AnsiString)"hola " "mundo");  //("mundo" es promovida)
  
... 

Saludos :)

JXJ 08-07-2016 18:15:02

Gracias.

ecfisa

Ñuño Martínez 11-07-2016 20:54:18

Cuando trabajas con textos en C nunca hay que olvidar que las constantes de cadena son punteros y no realmente una cadena como en Pascal. En C++ estos pueden convertirse en objetos "string" haciendo la cosa algo más sencilla; me han dicho que desde el C99 la cosa ha mejorado mucho, aunque no lo he comprobado. :rolleyes: La última vez que usé C++ los objetos "string" se comportaban a veces como cadenas Pascal y otras como punteros C, según le diera el aire, lo cual era un dolor en algunas ocasiones (errores difíciles de localizar). Si han arreglado eso, bien por ellos.

ecfisa 12-07-2016 12:40:27

Hola.

Si, como te comentan, es importante diferenciar el C-string de las clases string de C++(STL) y AnsiString de C++ Builder (VCL).

El primero es un arreglo de caracteres terminado en '\0'. Un C-string que almacena la palabra "hola" contiene cinco caracteres: 'h', 'o', 'l', 'a', '\0'.

Por otro lado existe una fuerte relación entre punteros y arreglos en C:
Código PHP:

{
  
char cad [] = "hola ";
  
charpcad = &cad[0]; // comúmente sólo: &cad
  
  //entonces se ve que: 
  
printf("%c %c"cad[0], *(pcad+0)); // h h
  
printf("%c %c"cad[1], *(pcad+1)); // o o 

Es tán intrínseca esa relación, que es muy común ver inicializar variables así:
Código PHP:

{
  
charcad "hola ";
  
  
printf("%c %c"cad[0], *cad); // h h 

La clase AnsiString es el análogo C++ Builder a las cadenas largas de Delphi (AnsiString).
En cuanto a las clases string (STL) y AnsiString (VCL), aunque no son iguales, permiten funcionalidades similares a la hora de asignar y concatenar.

string (STL):
Código PHP:

...
#include<string>

int main()
{
  
std::string s1 "hola ";
  
std::string s2 "mundo";
  
std::string s3 s1 s2

AnsiString (VCL):
Código PHP:

#include <vcl.h>
...
{
  
AnsiString s1 "hola "
  
AnsiString s2 "mundo";
  
AnsiString s3 s1 s2

Saludos :)


La franja horaria es GMT +2. Ahora son las 06:39:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi