2016-04-11 22 views
5

işlevine geçirme programlaması UserID ile ayrıştırmak için bir işlev kullanıyorum ve bazı hata denetimleri. Fonksiyon benim ana() den çağrılır ... Ancak, yalnızca UserID ve Pswd'nin ilk 4 karakteri çalıştırıldığında başarıyla çıkarılır. C-programlamada yeniyim ve C'den geliyorum. Nereye yanlış gittiğimi bilmiyorum. Bu oldukça kolay olmalı, birisi bana doğru yönde işaret edebilir mi? Ben harici işlevini kullanın ve sonra benim ana fonk çalıştığını tüm kodu yoksa C Bir char dizilimini

static void func1(int argc, char *argv[], char *UserID[30], char *Psw[30]) 
{ 
    strncpy(UserID, argv[1], sizeof(UserID)); 
    strncpy(Psw, argv[2], sizeof(Psw)); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[30];       
    char Psw[30]; 
    func1(argc, argv, UserID, Psw); 
} 

Ayrıca sadece işaret etmek.

DÜZENLEME: -

sorunu çözdü: -

static void func1(int argc, char *argv[], char *UserID, char *Psw) 
{ 
    strncpy(UserID, argv[1], UserIDMaxSize); 
    strncpy(Psw, argv[2], PswMaxSize); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[UserIDMaxSize + 1]; /* max val defined in a header file */       
    char Psw[PswMaxSize + 1]; /* max val defined in a header file */ 
    func1(argc, argv, UserID, Psw); 
} 

sizeof Ben .. her zaman benim işaretçisinin boyutunu okuyordu bekleniyor oldukça olarak çalışmıyor Varsayılan olarak 4 karakter.

+4

tarafından kapalı mı verdi , ne vardı ve neden onları görmezden geldin? –

+0

'function': 'char *', 'char **' 'den indirekt seviyelerinde farklıdır – Philo

+0

' strncpy ': resmi ve gerçek parametre 1 için farklı tipler 1 – Philo

cevap

1

strncat() önermek,

static void func1(int argc, char *argv[], char *UserID, size_t UserIDSize, 
    char *Psw, size_t PswSize) 
{ 
    if (argc> 1) strncpy(UserID, argv[1], UserIDSize); 
    if (argc> 2) strncpy(Psw, argv[2], PswSize); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[30] = {0};  
    char Psw[30] = {0}; 
    func1(argc, argv, UserID, sizeof UserID, Psw, sizeof Psw); 
} 

hedef diziler sona boş bir yapıya sahip olmaları temin etmek için işleve dizi boyutu geçmek sonuç."strncpy() çok fazla sorunları var, her zaman bir null karakteri ile bir dizi yol açmaz

static void func1(int argc, char *argv[], char *UserID, size_t UserIDSize, 
    char *Psw, size_t PswSize) { 
    UserId[0] = '\0'; 
    // if (argc> 1) strncat(UserID, argv[1], UserIDSize); 
    if (argc> 1) strncat(UserID, argv[1], UserIDSize - 1); 
    Psw[0] = '\0'; 
    // if (argc> 2) strncat(Psw, argv[2], PswSize); 
    if (argc> 2) strncat(Psw, argv[2], PswSize - 1); 
} 

[Düzenle]

düzeltildi kod -. Derleyici size herhangi bir uyarı 1

1

TL;

sizeof DR

beklediğiniz şeyi yapmıyor. Bunun yerine strlen kullanmayı deneyin. Yalnızca herhangi N için sizeof(char*[N]) çünkü kopyalanan 4 karakter alıyoruz


sadece işaretçi boyutu olacak. Platformunuzda, bir işaretçi 4 bayt (32 bit) olmalıdır.

Aslında dizinin temel adresini işleve iletmek istediğiniz anlamına geliyor, ancak bu durumda türleriniz tam olarak doğru değil. Derleyiciniz sizi bu konuda uyarmalı. Eğer son 2 argüman türlerinden * kaldırması gerekir:

uyarı kurtulmak gerektiğini ve aslında sizeof davranır doğru yanı yapmalıdır
static void func1(int argc, char *argv[], char UserID[30], char Psw[30]) 

(sizeof(char[30]) beri 30'dur). Ancak, char* ve char[] ile davranış farklı olduğundan sizeof ile hata yapmak çok kolay ... Bunun yerine strlen (veya strnlen olası arabellek taşmalarını önlemek istiyorsanız) kullanmayı tercih ederim, sahip olmadığınız birçok null karakter.

Eğer bir char* beklediği bir işleve bir char** geçmesi için çalışıyoruz şikayet olacağından ayrıca, Parametreniz tipleri yanlış olduğunu tüyo yardımcı olacaktır strnlen yerine sizeof daha kullanma.

+0

'daki her çağrıyı takip etmeliyiz Kodda olduğu gibi strlen kullanırsam, o zaman sadece sayıları alırım benim userID ve Pswd içinde, karakterlerin geri kalanı null-sonlandırıldı .... Ayrıca, sadece dış işlevini kullanmazsam ve ana kodumdaki tüm kodları varsa, o zaman çalışır. – Philo

+0

Scott Hunter'ın kendi yorumunda belirttiği gibi, bu kodla bazı derleyici uyarıları almalısınız çünkü bir tür uyuşmazlığınız var ... Bu uyarıları giderirseniz muhtemelen işe yarayacaktır. – DaoWen

2

İşaretçinizin 4 Byte boyutunda olduğunu tahmin ediyorum. bu nedenle sadece 4 karakter okuyorsunuz. > "Bir sonlandırıcı boş karakteri her zaman eklenir -

+0

Sizin amacınız bana ipucu verdi. Teşekkürler. – Philo

-1

Çözelti

#include <stdio.h> 
#include <string.h> 
void func1(int argc, char *argv[], char *UserID, char *Psw) 
{ 
    strncpy(UserID, argv[1], strlen(argv[1])); 
    strncpy(Psw, argv[2], strlen(argv[2])); 
printf("DATA: %s \n",UserID); 
printf("DATA1: %s \n",Psw); 
} 

int main(int argc, char *argv[]) 
{ 
    char UserID[30]; 
    char Psw[30]; 
     printf("argv1 %ld \n",strlen(argv[1])); 
     printf("argv2 %ld \n",strlen(argv[2])); 
    func1(argc, argv, UserID, Psw); 
} 
+0

hala aynı sorun, sadece ilk 4 karakter – Philo

+1

tutarlı girinti bu kodu bizim tarafımızdan çok daha okunabilir hale getirecektir. – user3629249