如何在我的c程序中正确使用指针

时间:2017-12-05 06:31:48

标签: c arrays pointers

所以我把这个代码交给我的老师,以为我已经完成了他的请求,我们使用指针技术来编写我们的刽子手任务。他把它还给我说我使用了数组技术而不是指针技术。我一直在努力学习指针和数组,所以我有点困惑如何解决他说我出错的地方。

这些是我标记的数组技术而非指针技术的部分:

*(q + i) = '*';

if (ch[0] == *(p + i))

*(q + i) = ch[0];

我的完整程序代码如下(任何人都可以帮助我理解如何实现正确的指针技术,我显然没有得到它 - 提前感谢):

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

void Instructions();
void PlayGame();
void PrintToLog(char *word);

int main()
{

Instructions();
PlayGame();

return 0;
getchar();
}

void Instructions()
{
printf("This is a game of hangman. Attempt to guess secret word\n");
printf("by entering a letter from a to z. The game is over once you\n");
printf("have entered 8 incorrect guesses.\n\n");
}

void PlayGame()
{
char word[] = { "hello" };
char guessed[20];
int i, incorrect_count, found;
char ch[2];
char *p, *q;

p = &word;
q = &guessed;
strcpy(guessed, word);

PrintToLog(word);

for (i = 0; i < strlen(guessed); i++)
{
    *(q + i) = '*';
}
incorrect_count = 0;

while (incorrect_count < 8 && strcmp(guessed, word) != 0)
{
    for (i = 0; i < strlen(guessed); i++)
        printf("%c ", guessed[i]);
        printf("\n");
        printf("Enter your guess:");
        gets(ch);
        found = 0;
    for (i = 0; i < strlen(word); i++){
        if (ch[0] == *(p + i))
        {
            *(q + i) = ch[0];
            found = 1;
        }
    }
    if (found == 0)
        incorrect_count++;
}

if (incorrect_count < 8)
{
    printf("\nThe word is %s. You win!", word);
    getchar();
}
else
{
    printf("\nThe correct word is %s. You lose!", word);
    getchar();
}

return 0;
}

void PrintToLog(char *word)
{
FILE *pOutput;

pOutput = fopen("MyLogFile.txt", "w+");
if (!pOutput) return;
fprintf(pOutput, "Start of game\n");
fprintf(pOutput, "This is the word player is trying to guess: %s\n", word);

fclose(pOutput);
}

2 个答案:

答案 0 :(得分:2)

原件:

    *(q + i) = '*';
    if (ch[0] == *(p + i))
    *(q + i) = ch[0];

变为:

    q[i] = '*';
    if (ch[0] == p[i]))
    q[i] = ch[0];

指针是基地址,你可以像数组一样索引它,编译器会根据指针的类型声明来计算偏移量。

q =数据的基地址,[i]从基地址索引。

如果您想将所有数组引用转换为指针,我认为我的错误解释了您的问题:

原件:

    *(q + i) = '*';
    if (ch[0] == *(p + i))
    *(q + i) = ch[0];

变为:

    *(q + i) = '*';
    if (*ch == *(p + i)))
    *(q + i) = *ch;

我无法完全看到正在尝试制作的观点,在C中,指针和数组没有区别,它们是相同的,你可以用任何一种方式访问​​它们。

让我们重新编码你的循环:

    for (i = 0; i < strlen(word); i++){
        if (ch[0] == *(p + i))
        {
            *(q + i) = ch[0];
            found = 1;
        }
    }

变为:

    for( p=word; *p!='\0'; p++ ) {
        if ( *ch == *p ) {
            *p = *ch;
            found = 1;
            break;
        }
    }

答案 1 :(得分:0)

首先,p = &word;q = &guessed;不正确;在两种情况下都删除&wordguessed是包含char类型值的数组,在大多数情况下,它会“衰减”到指向其第一项的指针。

作为数组衰减的示例,请考虑guessed

Expression     Type
===========    ========
 guessed       char[20]
 guessed[0]    char
&guessed[0]    char *
  • guessed包含char[20]类型,或“20个char值数组”。
  • guessed[0]的类型为char,与*(guessed + 0)相同,即从数组的开头起0 char s(这是数组中的第一项)
  • &guessed[0]的类型为char *,与&*(guessed + 0)相同。由于&*是反向操作,因此它们相互抵消,导致&guessed[0]guessed + 0相同 - 或仅guessedguessed&guessed[0]之间的唯一区别是类型,因为[0]索引操作发生在&之前,导致类型不同。在您guessed的作业中,数组衰减有效地使&guessed[0]q相同,因此您可以编写其中任何一个。

数组变量guessed&guessed[0]的行为不同的例外情况是:

  • sizeof(guessed):获取整个数组的大小
  • &guessed:获取指向数组的指针,类型为char (*)[20] - 指向20 char值数组的指针

至于教师的说明,您可能需要修改pq指针本身,而不是使用*(x + i),这与x[i]相同。

例如:

q = guessed;
/* lines skipped */
for (i = 0; i < strlen(guessed); i++)
{
    *(q + i) = '*';
}

变为:

/* lines skipped */
for (q = guessed; *q != 0; q++)
{
    *q = '*';
}

类似地:

for (i = 0; i < strlen(word); i++){
    if (ch[0] == *(p + i))
    {
        *(q + i) = ch[0];
        found = 1;
    }
}

可以改写为:

for (p = word, q = guessed; *p != 0; p++, q++)
{
    if (ch[0] == *p)
    {
        *q = ch[0];
        found = 1;
    }
}