2013-05-02 24 views
6

Web araması ile herhangi bir bilgi bulamadım. Nereye bakmalıyım? Eğer iyi bir kaynaktan arıyorsanızBir dizenin ilk 10 karakterini mi alıyorsunuz?

+3

'adam strncpy' sen –

+0

@Ryan gitmek, Ya bırakın ve o anlamına geliyordu kullanılmış olabileceğinden bu C++ olduğundan bahsetmiş. – ikegami

+0

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

cevap

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

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

hızlı soru, strncpy yapabilir miyim (myString, myString, 10)? – user2341069

+0

dizgiyi 10 karaktere kırpmak istiyorsanız myString [10] = 0; (Bu myString lettral bir dize değil, belleğe işaret ettiği göz önüne alındığında) –

+0

@ user2341069 Hayır, "sayfa dizeleri çakışamaz ve hedef dizesi dest kopyayı almak için yeterince büyük olmalıdır." MyString, bellekteki bir char dizisine işaretçiyken, aynı işaretçiyi iki kez kullanmak, bellekte "üst üste binme" anlamına gelir ve dolayısıyla bir hataya neden olur. Esas olarak bu, src'nin dst dizisi veya tersi olamaz. – TonyArra

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

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

Dikkat et: 'target' başlatılmamış bir işaretçidir. – michaelb958

+0

@ michaelb958 Eklemek veya değiştirmek için neye ihtiyacım var? – tianz

+2

hedef başlatılmamış işaretçi değil. hedef, yığındaki 100 baytlık belleğe işaret eder. \ 0 strncpy koyacağından nessesary değil –

0

, burada kullanabileceğiniz bir online adam sayfasının bir örnek: http://linux.die.net/man/3/strncpy

Önemli not etmek: Ayrıca strncpy yerine memcpy kullanabilirsiniz ancak null sonlandırıcı baytınızı eklemenizi gerektirir.

Uyarı: src'nin birinci n baytları arasında boş bayt yoksa, dest içine yerleştirilen dize boş sonlandırılmayacaktır.

Bu nedenle, memcpy ve strncpy burada hemen hemen aynıdır ve memcpy daha verimli ve daha az hataya açıktır.

0

Böyle çalıştım.

# 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

Ayrıca .10 hassas formatı ile sprintf kullanabilirsiniz:

#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

hedefe ulaşmak için birçok farklı yolu vardır:

  • Sen snprintf kullanabilirsiniz (en güvenli):

    char source[] = "abcdefthijklmn"; 
    char target[100]; 
    
    snprintf(target, sizeof target, "%.10s", source); 
    
  • Hedef en az 11 elemana sahiptir biliyorsanız
  • Sen strncat kullanabilirsiniz:

    char source[] = "abcdefthijklmn"; 
    char target[100]; 
    size_t len = strlen(source); 
    
    if (len > 10) 
        len = 10; 
    memcpy(target, source, len); 
    target[len] = '\0'; 
    
  • :

    char source[] = "abcdefthijklmn"; 
    char target[100]; 
    
    *target = '\0'; 
    strncat(target, source, 10); 
    
  • Sen (hedef büyüklüğü hakkında aynı varsayımı) strlen ve memcpy kullanabilirsiniz Bir döngü kullanabilirsiniz (hedefin boyutuyla aynı varsayım):

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

1

: Burada

char* someString = "your string goes here"; 

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

    return 0; 
} 
İlgili konular