2016-03-21 28 views
0

dize bu formda geçerli: Bir dizeden 2 int nasıl kopyalayabilirim?

int i=0; 
for (i=0;isdigit(str[i]);i++){ 
} 
char *dest1; 
strncpy(dest1, str, i-1); 
dest1[i]='\0'; 

Ve ikinci int için

, tekrar yaptım:

123 456\n 

Benim temel fikir-döngü bir yan boşluk bulmaktır

int j=i+1; 
for (;isdigit(str[j]);j++){ 
} 
char *dest2; 
strncpy(dest2; (str+j); j-i); 
dest2[j-i+1]='\0'; 
int from = atoi(dest1); 
int to = atoi(dest2); 

Ama bunu ikinci kez Xcode söyleyen & & ' 'çok az argümanlar işlev benzeri makro çağırmayı sağlanan' ifade sonucu kullanılmamış '.

Ama onlar aynı sözdizimidir ... Birisi bana nerede yanlış yaptığımı söyle?

+1

, bu nedenle bu tanımlanmamıştır. – EOF

+0

Onları başlattıktan sonra hala bu iki hata var. –

+1

İyi, yanlış yerine, ikinci snippet'te 'strncpy()' argümanları arasında ';' 'yerine. Ancak, kodun, programın tanımlanmamış davranış göstermesini çok olası kılan başka bir dizi kusur vardır. – EOF

cevap

0

Yolunuz (sabit) Sen `dest1` veya` dest2` başlatılmamış olması

char *str = "123 456\n"; 

int i=0; 
for (i=0; isdigit(str[i]); i++){ 
} 
char dest1[4]; 
strncpy(dest1, str, i); 
dest1[i]='\0'; 

int j=i+1; 
for (;isdigit(str[j]);j++){ 
} 
char dest2[4]; 
strncpy(dest2, str+i+1, j-i-1); 
dest2[j-i-1]='\0'; 
int from = atoi(dest1); 
int to = atoi(dest2); 

Benim yöntemim

int from, to; 
char *str = "123 456\n"; 

int ret = sscanf(str, "%d %d", &from, &to); 
1

Buna gerek yok, dize yalnızca tamsayılar varsa, bir ayraç ile ayrılan belirteçleri döndüren strtok() işlevini kullanabilirsiniz sscanf()

int value; 
int count; 
char *pointer; 
char str[] = "123 456"; 

pointer = str; 
while (sscanf(pointer, "%d%n", &value, &count) == 1) 
{ 
    fprintf(stdout, "%d\n", value); 
    pointer += count; 
} 
+1

Dize, bir sayı olarak ayrıştırılamayan beyaz boşluk içermiyorsa, ilk değişken döngü sonsuz değişmez mi? – EOF

+0

Ne demek istediğini görüyorum ... –

+0

Bkz. [Strtol() '] 'ın doğru kullanımı (https://stackoverflow.com/questions/14176123/correct-usage-of-strtol/14176593?s=2|3.7929# Strtol() 'in nasıl daha doğru kullanılacağı hakkında bir tartışma için 14176593). Eğer siz 'sizeof (int)! = Sizeof (long)' ise, birden fazla probleminiz olduğunu unutmayın. Hatalı bir şekilde ele alırsanız, hata işleme ile ilgileniyorsanız, raw strtol() satır içi kullanamazsınız; hassas kontrol yapan bir fonksiyonda çağrılmalıdır.Hata işleme ile ilgilenmiyorsanız, bununla kurtulabilir, ancak bunun yerine atol() 'yi düşünebilirsiniz. –

0

kullanın. Böylece beyaz alanı sınırlayıcıya ekleyebilirsiniz. Örneğin

:

#include <string.h> 

char str[] = "123 456 789"; 
char *token; 
int number; 

token = strtok(str, " "); 

for(int i=0; i < 2; i++){ 
    number = atoi(token); 
    printf("%d\n", number); 
    token = strtok(NULL, " "); 
} 

Bu, yazdırır bu: strtok() sadece ilk çağrıda dize alır

123 
456 
789 

Not söyledi. Öyleyse, NULL'ü belirli dizenin sonuna kadar kullanmanız gerekir - ya sayılırsınız (tahmin edildiniz, biliniyordu), ne kadar giriş var ya da strtok() bir NULL işaretçisini döndürdü.

+0

Not 1) OP'nin dizesi "123 456 \ n" 'idi. 2) 'atoi (token)' i kullanmak, 'token! = NULL ',' strtok()' 'NULL '' 'i iade edebilecek kadar zayıf bir kod oluşturur. – chux

İlgili konular