2017-04-03 60 views
0

我一直在閱讀關於字符串數組的其他一些問題。我提出了一些見解並改變了我的代碼,但我遇到的一個問題是併入sprintf。C編程 - Sprintf和字符串陣列

高級別,其目的將最終成爲一個功能,打開/ fread目錄中的可變數量的文件。但掛在這個字符串操作部分。

我想在sprintf中增加我的指針,但是我遇到了細分問題。關於修復我擁有的或者不同的路線的任何想法? MAX = 20,FILES = 4

char fName_A[MAX]; 
char fName_B[MAX]; 
char * ptr_A[FILES]; 
char * ptr_B[FILES]; 
int i; 

for(i=0; i<FILES; i++){ 
    sprintf(fName_A, "waveA00%d.bin", i); 
    sprintf(fName_B, "waveB00%d.bin", i); 

    ptr_A[i] = fName_A; 
    ptr_B[i] = fName_B; 

    printf("Ch1 File Number %d is named %s\n", i, *(ptr_A+i)); 
    printf("Ch2 File Number %d is named %s\n", i, *(ptr_B+i)); 
} 

printf("fName_A[0] = %s\n", *ptr_A); 
printf("fName_A[1] = %s\n", *(ptr_A + 1)); 
printf("fName_A[2] = %s\n", *(ptr_A + 2)); 
printf("fName_A[3] = %s\n", *(ptr_A + 3)); 

return 0; 
+1

*調試這個*,你會發現在'ptr_A'點每個指針到相同的緩衝'fName_A',同樣有帶有指針和緩衝區的'B'端。這意味着您爲每個文件寫入的* last *文件名將被複制到指針數組中,因爲它們都是相同的地址。 – WhozCraig

+0

忘記包括我的結果,基本上我的指針只接受最後一個循環項目,這是我測試後的所有printf語句。我想這會發生,但我有分段錯誤傳遞指針本身。 – kwalsh

+0

@WhozCraig確切 – kwalsh

回答

0

你不分配與Ptr_A和Ptr_B相關的字符串的所有記憶,只需設置指針指向緩衝區fName_A和fName_B,所以當你在最後檢查,它們都指向存儲在這些緩衝區中的最後一個字符串。

通過爲A和B中的每個文件名將存儲分配爲字符數組而不是使用指針來修復它。這裏有一個例子:

#include <stdio.h> 
#include <string.h> 

#define MAX 100 
#define FILES 4 

int main(int argc, char** argv) 
{ 
char fName_A[MAX]; 
char fName_B[MAX]; 
char A[FILES][MAX]; 
char B[FILES][MAX]; 
int i; 

for(i=0; i<FILES; i++){ 
    sprintf(fName_A, "waveA00%d.bin", i); 
    sprintf(fName_B, "waveB00%d.bin", i); 

    strcpy(A[i], fName_A); 
    strcpy(B[i], fName_B); 

    printf("Ch1 File Number %d is named %s\n", i, A[i]); 
    printf("Ch2 File Number %d is named %s\n", i, B[i]); 
} 

for(i=0; i<FILES; i++) { 
    printf("A[%d] = %s\n", i, A[i]); 
    printf("B[%d] = %s\n", i, B[i]); 
} 
} 

這將輸出如下:

Ch1 File Number 0 is named waveA000.bin 
Ch2 File Number 0 is named waveB000.bin 
Ch1 File Number 1 is named waveA001.bin 
Ch2 File Number 1 is named waveB001.bin 
Ch1 File Number 2 is named waveA002.bin 
Ch2 File Number 2 is named waveB002.bin 
Ch1 File Number 3 is named waveA003.bin 
Ch2 File Number 3 is named waveB003.bin 
A[0] = waveA000.bin 
B[0] = waveB000.bin 
A[1] = waveA001.bin 
B[1] = waveB001.bin 
A[2] = waveA002.bin 
B[2] = waveB002.bin 
A[3] = waveA003.bin 
B[3] = waveB003.bin 
+1

啊非常有趣!欣賞我的問題的解決方案和解釋ScottK ! – kwalsh