2010-01-29 44 views
1

我试图使用一个数组来保存一个调查的输入,每一边都有相等的正值,但有一个指向数组中心的指针,因此可以使用负指针值访问数组。指针,数组,printf

例如,数组的值将保持在0到30之间,指针将指向15,并且将提示用户输入介于-15和15之间的值,其中用户值的数组将增加。

如果我的逻辑还不完全正确,但是我现在遇到的问题是递增值(我不确定是否正确输入ptr[userInput]++并输出这些值值printf。我看到别人的帖子关于传递数组到printf实际上是传递一个指针到数组,而且这个人说要用**ptr(*ptr)[0]去引用它两次,但我的编译器(Mac XCode)似乎没有。?。喜欢它

任何想法这是我的代码,我评论在我的问题是:

#define ENDPOINT 15 
#define TERMINATE 999 
#define TEST_FILE "TestFile6.txt" 

void RecordOpinions(void) 
{ 
    int record[2 * ENDPOINT + 1]; 
    int *ptr = &record[ENDPOINT + 1]; 
    int userInput; 
    int loopCount = -ENDPOINT; 

    printf("ptr:%d\n", *ptr); // this was a test for me trying to figure out how to 
           // print the value of the ptr. 

    printf("Please enter your opinion of the new TV show, Modern Family from "); 
    printf("-%d(worst) to 0 to +%d(best). Entering %d ", ENDPOINT, ENDPOINT, TERMINATE); 
    printf("will terminate and tabulate your results: \n"); 

    scanf("%d", &userInput); 
    while (userInput != TERMINATE) { 
     if (userInput > ENDPOINT || userInput < -ENDPOINT) { 
      printf("Invalid entry. Enter rating again: "); 
     } 
     else { 
      printf("You entered: %d\n", userInput); 

      ptr[userInput]++;  // not sure if this is the right way to increment 
            // the array at the user's input value. 
     } 
     scanf("%d", &userInput); 
    } 
    printf("Rating entry terminated.\n"); 
    printf("Ratings:.\n"); 
    for (; loopCount <= ENDPOINT;) { 
     printf("%d\n", ptr[loopCount++]); // this part is where I also need help 
               // in trying to print out the value of 
               // the ptr, not the address. 
    } 
} 
+0

1+只是为了说明您的疑虑并向我们展示代码:) – Skurmedel 2010-01-29 17:43:54

+1

输出是什么? – 2010-01-29 17:45:20

回答

3

就您在问题中提出的直接问题而言,您的代码非常好。即你正在正确地处理你的“双面”数组(并且不,当你在数组中的值时,你不需要任何额外的引用)。

我看到的一个问题是,您忘记了初始化(将初始值分配给)您的record数组,这意味着输出结果无论如何都将是垃圾,对于您如何使用它将产生严重后果。

此外,戴夫韩丁在评论中指出,如果你想使用-ENDPOINT+ENDPOINT范围从ptr起源,你需要初始化你ptr&record[ENDPOINT],不与&record[ENDPOINT + 1]。否则,如果用户输入ENDPOINT值作为索引,则最终会在右端出现越界访问。 (并且record[0]的值将在左端始终保持未使用状态。)

P.S.我会做出不少“风格”上的改变,但在这种情况下他们并不重要。

+1

我想他们也许意思是初始化'int * ptr =&record [ENDPOINT];'而不是'int * ptr =&record [ENDPOINT + 1];'。 – dave4420 2010-01-29 17:50:25

+0

@ Dave Hinton:是的,赶上! – AnT 2010-01-29 17:52:00

+0

感谢您的初始化帮助。这是有道理的。我现在面临的问题是让我自己相信戴夫所说的。我试图把它画出来,而且我的记录值从0到30有31个值。但是如果我想让ptr的原点为+15和-15,是不是必须指向记录阵列上的数字15,它实际上是数组的第16个索引?我的意思是我看到它实际上并没有和ENDPOINT + 1一样工作,而Dave是正确的,但我不明白为什么它不正确等于ENDPOINT + 1.再次感谢! – Crystal 2010-01-29 22:22:20

0

为什么不从用户输入的数字中减去15? I.E.

ptr[userInput - ENDPOINT]++; 

其中ptr指向数组的开始?这更容易理解,更传统。

+0

恰恰相反。如果问题的本质要求将负指数和正指数都映射到数据,那么OP使用的方法将更加优雅和可读。事实上,这是惯用的。 – AnT 2010-01-29 18:02:57