2011-01-21 20 views

cevap

12
void chopN(char *str, size_t n) 
{ 
    assert(n != 0 && str != 0); 
    size_t len = strlen(str); 
    if (n > len) 
     return; // Or: n = len; 
    memmove(str, str+n, len - n + 1); 
} 

Alternatif tasarım: Örneğin

size_t chopN(char *str, size_t n) 
{ 
    assert(n != 0 && str != 0); 
    size_t len = strlen(str); 
    if (n > len) 
     n = len; 
    memmove(str, str+n, len - n + 1); 
    return(len - n); 
} 
+0

+1, ama aslında, (aslında onaylama yerine -1) karakter sayısını yazdıran int olarak daha iyi olmaz mıydı? –

+0

@Tim: Her türlü olası tasarım var; Bu kabaca minimal bir uygulama - genel olarak, ödevin erken dönüşten daha iyi olduğunu düşünüyorum. Dönüş değeri - azaltılmış uzunluğa geri dönerek iyi olurdu - büyük olasılıkla girdi gibi 'size_t' olurdu. –

0

C dizesi, sürekli konumlarda bir dizi karakterdir. Dizinin boyutunu artıramaz veya azaltamayız. Ancak orijinal boyut eksi 3'ün yeni bir karakter dizisi oluşturun ve karakterleri yeni diziye kopyalayın.

+1

Bu, dizenin ilk üç karakterini kopyalayacak. Soru, ilk üç karakteri * nasıl * kaldırılacağını sorar. – mipadi

+0

Evet Sadece farkettim. Teşekkürler. – Mahesh

0

Eh, dize kopya (http://en.wikipedia.org/wiki/Strcpy) hakkında bilgi yazdırmak ve yeniden deneyecek. pseudocode:

find the pointer into the string where you want to start copying from 
copy from that point to end of string into a new string. 
+1

-1. Açıklama olmadan kod referanslara ve tamamen açık "pseudocode" linkleri daha iyidir. – pelesl

6

, ilk 3 karakterleri kaldırmak için

char a[] = "123456"; 

basit yolu varsa olacaktır:

char *b = a + 3; // the same as to write `char *b = &a[3]` 

b "456"

içerecektir Ancak genel durumda da emin olmalısınız

+0

Sadece '' nornot (char) '** yararsız ** değil, aynı zamanda diğer türler için ** yanlış **. İşaretçi aritmetiği, bayt değil öğelerin biriminde gerçekleşir. –

+0

Evet, haklısınız. Cevabı düzenlediniz –

İlgili konular