2016-04-08 10 views
2

Programlama dersim için, bir sürücüden gelen 'str' dizesini alan bir incrementstring() işlevi yazmaya çalışıyorum ve bunlara bir tane eklerim. Hem harflerle hem de sayılarla çalışmalıdır (örn. '1' '2' ye gider, 'a' b 'ye gider,' z '' aa 'a gider,' ZZ '' AAA'ya gider). Neredeyse her test koşulu var, bir böcek bulamadığım bir böcek dışında. Ben işlevini çalıştırdığınızdaDize Arttırma İşlevi C

void incrementstring(char* str){ 
int i; 
int j; 
int length = strlen(str); 
for(i = strlen(str)-1; i >= 0; i--){ 
    if (str[i] == '9'){ 
      str[i] = '0'; 
      if (str[0] == '0'){ 
        for (j = strlen(str)-1; j>=0; j--){ //This loop is the problem 
          str[j+1] = str[j]; 
          } 
        str[0] = '1'; 
        } 
    } 
    else if (str[i] == 'z'){ 
      if (str[0] == 'z'){ 
        str[i] = 'a'; 
        str[i+1] = 'a'; 
        } 
      str[i] = 'a'; 
      } 

    else if (str[i] == 'Z'){ 
      if(str[0] == 'Z'){ 
        str[i] = 'A'; 
        str[i+1] = 'A'; 
      } 
      str[i] = 'a'; 
    } 
    else{ 
      str[i]++; 
      return; 
    } 

} 
} 

, bu sürücü çıkışları nedir:

Bu

Şu anda ne var
1. testing "1"... = 2. Correct! 
2. testing "99"... = 100. Correct! 
3. testing "a"... = b. Correct! 
4. testing "d"... = e. Correct! 
5. testing "z"... = INCORRECT: we got "aa0". We should be getting "aa" instead. 
6. testing "aa"... = ab. Correct! 
7. testing "Az"... = Ba. Correct! 
8. testing "zz"... = aaa. Correct! 
9. testing "cw"... = cx. Correct! 
10. testing "tab"... = tac. Correct! 
11. testing "500"... = 501. Correct! 

11 tests run. 

Ben işlemek için hat 9'da döngü için yazdığı ' 99 'ila' 100 'koşulu. Dizenin her dizinini alır ve birini sağa kaydırır ve ardından dizenin başına bir '1' ekler. Ancak, bu döngü bir sebepten dolayı yukarıda görüldüğü gibi 5. test koşulunu bertaraf eder. Döngüyü çıkarırsam, '99' 00'a geçer, ancak 5. test problemsiz geçecektir. Burada bir tuğla duvara çarptım ve kimsenin içgörü sunabileceğini merak ediyordum.

Yardımı takdir ediyorum, teşekkürler.

+8

"Taşıma" işleminizden sonra (yani "dizgeyi" genişlettiğinizde), diziye NUL sonlandırıcı bir bayt eklemeniz gerekir. Tüm str [i + 1] = 'bir str [i + 2] = '\ 0'; Ayrıca ASCII karakter kümesini kabul ettiğinizi de biliyorsunuz değil mi? Yoksa bu sınıfın kapsamı dışında mı? – mpez0

+0

Burada bir hata ayıklayıcı kullanmak yararlı olabilir. –

+0

"Taşıma" durumunuz gerçekten her durumda işe yaramıyor: 'zaz' girmeyi deneyin - Gereksiniminizi aldım, ancak 'zaaa'ya' genişlerse, 'zba'ya dönüşmelidir. "Taşı" nızı tamamen yukarı taşıyamazsınız, ancak sadece önde gelen karakterlere bakmazsınız. – tofro

cevap

1

da dize uzunluğu takip ederken sen, onun ayrılan alan üzerine yazar sizin if() ve if else segmentlerin her birine bir boş sonlandırma karakteri katmayan emin olmak için:

str[0] = '1'; 
str[1] = 0; 

...

str[i] = 'a'; 
str[i+1] = 0; 

Ve benzeri.

Bu son ifade, yapmasını beklediğiniz şeyi yapmıyor olabilir.
Yapmak istediğiniz şeyin, ifadeyi str'a ait olan bir sonraki bellek öğesine işaret edecek şekilde artırması gerektiğine inanıyorum.
str'un aslında bir dizi olmadığını unutmayın. Bu bir işaretçidir. Kullanmakta olduğunuz [...]
notasyonu, işaretçilerden referans alma gibi bir diziye izin vermek için C içinde verilen bir kolaylıktır.
Örneğin str[i] ifadesi de *(str + i) olarak ifade edilebilir.(bir sonraki char saklanır) sonraki hafıza konumunu istediğiniz ise , ifade olacaktır: çevirir dizi gösterimini kullanırken *(str + i++): str[i++]

Değişikliği

else{ 
     str[i]++; 
aşağıdaki

için:

else{ 
     str[i++]=0; 
+1

Bu, her if ifadesinin sonuna NULL sonlandırıcı ifadeleri eklemeye ek olarak hile yapmak gibi görünüyordu. Yardımınız için herkese teşekkürler, sizler harika bir topluluksunuz. – acorbs

1

Sorununuz, dizinizi sürücü programında NULL olarak sonlandırmıyor olmanızdır. Kodunuzu kendi sürücü programım ile yürütmek mükemmel bir şekilde çalışıyor, böylece herhangi bir ek yardım, sürücü programınızı bizimle paylaşmanızı gerektiriyor.

Yapmanız gereken tek şey, char * dizesini dize ile doldurduktan sonra, bir sonraki karakteri '\0' karakterini yapınız. strlen işlevi, NULL sonlandırıcı bir karaktere ulaşıncaya kadar char s dizisi üzerinde yinelendiğinden, bunları kullanmadan önce tüm karakterleri bu karakterle sonlandırmanız gerekir.

+0

Not: C, büyük harf NULL en iyi 'NULL', boş gösterici sabit için ayrılmıştır. Burada, _null character_ ya da ''0'' öner. – chux

0

"zaz" için düzgün çalışıyor mu?