2016-09-10 21 views
5

Bir Win10 makinesinde tutulmayı Neon1 RC1 çalıştırıyorum ve hata ayıklama sırasında geçirdiğim her 012859083093692858870889007010 komut satırı argümanı/parametresi etrafında tek tırnak işareti ekliyor gibi görünüyor. Bu gösteriyi her argüman için hafızada görüyorum.Eclipse neden C komut satırı parametrelerine tek tırnak ekliyor?

Garip Bu alıntıları bir printf (RUN sırasında) ile konsola üretemiyorum; Program, parametreler ve çıkışlar tarafından belirtilen dosyayı başarıyla konsola yükler.

komut satırı argümanları

> Parametreler sekmesi olarak (tek çizgi, tırnak işaretleri eklendi) config- uygulama çalıştırmak SETIN: I NetBeans bu davranışı görmüyorum

keyFile.txt inputFile.txt outputFile.txt 

(aslında geçici olarak geçiş yaptı).

Sorun, bu hata ayıklama sırasında fopen ile ilgili sorunlara neden olduğu görünüyor: dosyayı bulamıyor. Her ikisi de aynı çalışma dizini kullanıyorsunuz, çünkü "keyFile.txt" statik bir dosya adı kullanırsam, hata ayıklama Tamam çalışıyor.

Maalesef konsol çıktısı hata ayıklamada çalışmıyor, bu yüzden şu an biraz sınırlıyım.

örnek kod çok aşağı kesilmiş versiyonu, göstermek için:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char** argv) { 

    // arguments: keyfile.txt inputfile.txt outputfile.txt 

    char * firstArg = argv[1]; 
    char * secArg = argv[2]; // leaving these to show quotes on other inputs as well 
    char * thirdArg = argv[3]; 

    printf("First arg:\t%s\n", firstArg); 
    printf("Ptr Address, uint cast:\t0x%x\n", (unsigned int) firstArg); 
    printf("Ptr Address, void* cast:\t%p\n", (void *) firstArg); 
    printf("Char at Ptr:\t%c\n\n", (char) *(firstArg)); 

    printf("Second arg: \t%s\n", secArg); 
    printf("Third arg: \t%s\n", thirdArg); 

    FILE *fptr; 
    fptr = fopen(firstArg, "rb"); 
    if (fptr == NULL) 
    { 
     perror("Error"); 
     return -1; 
    } 

    int kLength=0; 
    int inputChar; 
    unsigned char keyin[256]; 

    printf("\nData from file:\n"); 
    while ((inputChar = fgetc(fptr))!=EOF)  // read KEYFILE 
    { 
     if ((kLength%8)==0) { printf("\n"); } 
     keyin[kLength++] = (unsigned char) inputChar; 
     printf("0x%x\t",inputChar); 
    } 

    return 0; 
} 

On The Run çıkış/beklendiği gibi aşağıdaki gibidir:

First arg: keyFile.txt 
Ptr Address, uint cast:  0x6b1748 
Ptr Address, void* cast: 006B1748 
Char at Ptr: k 

Second arg:  inputFile.txt 
Third arg: outputfile.txt 
current Path: C:\Users\***\Google Drive\***\eclipse workspace\argTest 
Data from file: 

0x59 0x45 0xba 0x1e... 
... 
(data I expect is displayed from file ...) 

Ama hata ayıklama sırasında

, bir boş tarafından tuzağa fptr ve ben bellekte tırnak bkz:

Debug memory: firstArg points to 0x6E1760

gdb izlerine baktığımda, burada tek tırnakları da görüyorum. Aşağıda gösterilen her şey bu noktaya kadar önde:

311,234 2-gdb-version 
311,239 ~"GNU gdb (GDB) 7.6.1\n" 
311,240 ~"Copyright (C) 2013 Free Software Foundation, Inc.\n" 
311,240 ~"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\nThis is fre\ 
e software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitt\ 
ed by law. Type \"show copying\"\nand \"show warranty\" for details.\n" 
311,240 ~"This GDB was configured as \"mingw32\".\nFor bug reporting instructions, please see:\n" 
311,240 ~"<http://www.gnu.org/software/gdb/bugs/>.\n" 
311,240 2^done 
311,241 (gdb) 
311,243 3-environment-cd "C:/Users/***/Google Drive/***/workspace/argTest"\ 
311,250 3^done 
311,250 (gdb) 
311,251 4-gdb-set breakpoint pending on 
311,260 4^done 
311,260 (gdb) 
311,261 5-gdb-set detach-on-fork on 
311,270 5^done 
311,270 (gdb) 
311,271 6-enable-pretty-printing 
311,280 6^done 
311,280 (gdb) 
311,281 7-gdb-set python print-stack none 
311,290 7^done 
311,290 (gdb) 
311,291 8-gdb-set print object on 
311,300 8^done 
311,300 (gdb) 
311,301 9-gdb-set print sevenbit-strings on 
311,310 9^done 
311,310 (gdb) 
311,311 10-gdb-set host-charset UTF-8 
311,320 10^done 
311,320 (gdb) 
311,321 11-gdb-set target-charset WINDOWS-1252 
311,330 11^done 
311,330 (gdb) 
311,331 12-gdb-set target-wide-charset UTF-16 
311,340 12^done 
311,340 (gdb) 
311,342 13source .gdbinit 
311,350 &"source .gdbinit\n" 
311,350 &".gdbinit: No such file or directory.\n" 
311,350 13^error,msg=".gdbinit: No such file or directory." 
311,350 (gdb) 
311,351 14-gdb-set target-async off 
311,360 14^done 
311,360 (gdb) 
311,361 15-gdb-set auto-solib-add on 
311,370 15^done 
311,370 (gdb) 
311,379 16-file-exec-and-symbols --thread-group i1 Debug/argTest.exe 
311,384 16^done 
311,384 (gdb) 
311,385 17-gdb-set --thread-group i1 args 'keyFile.txt' 'inputFile.txt' 'outputFile.txt' 
311,394 17^done 
311,394 (gdb) 
... 
+0

Açık olan ilk soru: bu tırnak işaretlerini eklemediğini iki kere mi çektin? –

+0

Sonraki daha önemli soru: Bu yüzden, hata ayıklamasında çalışırken, printf tırnak işareti değil * * gösterilsin mi? Bu üç printf ifadesinin ardında ikinci bir printf (direksiyonun basılması) koyabilir misiniz? * Bu tırnak işaretleri dahil mi? –

+2

Ardından: main bir int döndürür. –

cevap

1

Benim geçici çözüm de argümanları ayarlamaktır. Argümanlar sekmesinde (Hata Ayıklama Yapılandırmaları'nda) yerine gdbinit dosyası, aşağıdaki satırı koymanız yeterlidir:

arj arg1 arg2 argümanı arg1 arg2

Ve sonra, iyi çalışıyor!

İlgili konular