2017-04-03 61 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