2013-05-02 13 views
6

Nie mogłem znaleźć żadnych informacji w wyszukiwarce internetowej. Gdzie powinienem szukać?Pierwsze 10 znaków ciągu?

+3

'man strncpy' tutaj idziesz –

+0

@Ryan albo zostawić je i wspomnieć, że jest to C++, ponieważ on może mieć na myśli, że. – ikegami

+0

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

Odpowiedz

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

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

szybkie pytanie, czy mogę zrobić strncpy (myString, myString, 10)? – user2341069

+0

jeśli chcesz obcinać łańcuch do 10 znaków, wtedy put myString [10] = 0; (To biorąc pod uwagę, że myString wskazuje na pamięć, a nie na ciąg lettral) –

+0

@ user2341069 no cant, jak na stronie man "Łańcuchy mogą się nie nakładać, a docelowy ciąg znaków musi być wystarczająco duży, aby otrzymać kopię." Ponieważ myString jest wskaźnikiem do tablicy znaków w pamięci, użycie tego samego wskaźnika dwukrotnie oznacza, że ​​"nakładają się" w pamięci, a zatem spowoduje błąd. Zasadniczo oznacza to, że src nie może być podłańcuchem dst ani na odwrót. – TonyArra

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

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

Uwaga: "target" to niezainicjowany wskaźnik. – michaelb958

+0

@ michaelb958 Więc co muszę dodać lub zmienić? – tianz

+2

cel nie jest niezainicjowanym wskaźnikiem. target wskazuje na 100 bajtów pamięci w stosie. \ 0 nie jest konieczne, ponieważ strncpy umieści go na –

0

Jeśli szukasz dobrego źródła, oto przykładem manualu online można użyć: http://linux.die.net/man/3/strncpy

Ważne, aby pamiętać: można też użyć memcpy zamiast strncpy , ale wymaga to dodania własnego bajtu kończącego.

Ostrzeżenie: Jeśli nie ma zerowego bajtu wśród pierwszych n bajtów src, ciąg znaków umieszczony w dest nie będzie zakończony znakiem NUL.

Dlatego memcpy i strncpy działają prawie tak samo, a memcpy jest wydajniejszy i mniej podatny na błędy.

0

Mam to do pracy w ten sposób.

# 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

Można również użyć sprintf z formatem .10 precyzji:

#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

Istnieje wiele różnych sposobów, aby osiągnąć swój cel:

  • Można użyć snprintf (najbezpieczniejsze):

    char source[] = "abcdefthijklmn"; 
    char target[100]; 
    
    snprintf(target, sizeof target, "%.10s", source); 
    
  • Można użyć strncat jeśli znasz docelowy ma co najmniej 11 elementów:

    char source[] = "abcdefthijklmn"; 
    char target[100]; 
    
    *target = '\0'; 
    strncat(target, source, 10); 
    
  • Można użyć strlen i memcpy (tak samo założenie o wielkości przeznaczenia):

    char source[] = "abcdefthijklmn"; 
    char target[100]; 
    size_t len = strlen(source); 
    
    if (len > 10) 
        len = 10; 
    memcpy(target, source, len); 
    target[len] = '\0'; 
    
  • Możesz użyć pętli (to samo założenie co do wielkości miejsca docelowego):

    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

Dodając do powyższych odpowiedzi:

char* someString = "your string goes here"; 

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

    return 0; 
} 
Powiązane problemy