2013-05-02 16 views
6

Non sono stato in grado di trovare alcuna informazione con una ricerca sul web. Dove dovrei cercare?Ottenere i primi 10 caratteri di una stringa?

+3

'man strncpy' qui si va –

+0

@ Ryan, o lasciare e dire che si tratta di C++ da quando avrebbe potuto significare che. – ikegami

+0

Evita 'strncpy': https://randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already/ – chqrlie

risposta

8
char myString[256]; // Input string 
char dest[256];  // Destination string 

strncpy(dest, myString, 10); 
dest[10] = 0; // null terminate destination 
+0

domanda veloce, potrei fare strncpy (myString, myString, 10)? – user2341069

+0

se si desidera troncare la stringa su 10 caratteri, quindi inserire myString [10] = 0; (Questo dato che myString punta alla memoria e non a una stringa lettral) –

+0

@ user2341069 no non puoi, come per la pagina man "Le stringhe non possono sovrapporsi, e la stringa di destinazione dest deve essere grande abbastanza per ricevere la copia." Poiché myString è un puntatore a un array di caratteri in memoria, l'uso dello stesso puntatore due volte significa che si "sovrappongono" in memoria e quindi causerà un errore. In sostanza, ciò significa che src non può essere una sottostringa di dst o viceversa. – TonyArra

4
char source[] = "abcdefthijklmn"; 
char target[100]; 

strncpy(target, source, 10); 
target[10] = '\0'; // IMPORTANT! 
+1

Attenzione: 'target' è un puntatore non inizializzato. – michaelb958

+0

@ michaelb958 Quindi cosa devo aggiungere o modificare? L'obiettivo – tianz

+2

non è un puntatore non inizializzato. punti di destinazione a 100 byte di memoria nello stack. il \ 0 non è nessario come strncpy lo metterà –

0

Se siete alla ricerca di una buona fonte, ecco un esempio di una pagina di manuale on-line è possibile utilizzare: http://linux.die.net/man/3/strncpy

importante notare: si potrebbe anche usare memcpy invece di strncpy , ma richiede di aggiungere il proprio byte che termina con null.

Avviso: se non esiste alcun byte null tra i primi n byte di src, la stringa inserita in dest non verrà terminata con null.

Quindi memcpy e strncpy funzionano quasi allo stesso modo qui, e memcpy è più efficiente e meno incline all'errore.

0

Ho capito che funziona così.

# include <stdio.h> 
    # include <string.h> 
    //Strings. String lenght terminator. 
    //KHO2016.no1. mingw (TDM-GCC-32) . c-ansi . 
    int main() 
    { 
    //declare 
    char src_str[20],dst_str[10]; 

    //valuate 
    printf ("Enter a sentance of 20 letters\n"); 
    gets (src_str); 
    strcpy (dst_str,src_str); 

    //calculate 
    dst_str [10] ='\0'; // from the "www.stack overflow" 
    printf ("%s",dst_str); 
    printf ("\n"); 

    //terminate 
    return 0; 
    } 
0

è anche possibile utilizzare sprintf con il formato .10 precisione:

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char source[] = "abcdefghijklmnopqrstuvwxyz"; 
    char dest[11]; 
    memset(dest, '\0', sizeof(dest)); 

    sprintf(dest, "%.10s", source); 

    printf("%s", dest); // abcdefghij 
    return 0; 
} 
0

Ci sono molti modi per raggiungere il tuo obiettivo:

  • È possibile utilizzare snprintf (più sicuro):

    char source[] = "abcdefthijklmn"; 
    char target[100]; 
    
    snprintf(target, sizeof target, "%.10s", source); 
    
  • È possibile utilizzare strncat se si conosce la destinazione ha almeno 11 elementi:

    char source[] = "abcdefthijklmn"; 
    char target[100]; 
    
    *target = '\0'; 
    strncat(target, source, 10); 
    
  • È possibile utilizzare strlen e memcpy (stessa ipotesi circa il formato di destinazione):

    char source[] = "abcdefthijklmn"; 
    char target[100]; 
    size_t len = strlen(source); 
    
    if (len > 10) 
        len = 10; 
    memcpy(target, source, len); 
    target[len] = '\0'; 
    
  • È possibile utilizzare un ciclo (stessa ipotesi sulle dimensioni della destinazione):

    char source[] = "abcdefthijklmn"; 
    char target[100]; 
    size_t i; 
    for (i = 0; i < 10; i++) { 
        target[i] = source[i]; 
    } 
    target[i] = '\0'; 
    
  • You could but should not use strncpy()

1

Aggiungendo alle risposte di cui sopra:

char* someString = "your string goes here"; 

int main() 
{ 
    int n = 10; 
    printf("(%.*s)\n", n, someString); 

    return 0; 
} 
Problemi correlati