C中的字符数组指针

时间:2015-03-17 23:02:35

标签: c

我想运行此代码,但我不能。我还没有开始在C中学习指针。我正在尝试获取字母的地址。问题是printf("in adress: %p\n",p[i]);`谢谢

#include <stdio.h>

int main(void){
    char letter;
    int c=0;
    int i;
    char pattern[7];
    char *p;
    printf("Enter a letter: ");
    scanf("%c",&letter);
    printf("Enter a pattern: ");
    scanf("%s",pattern);
    p=pattern;
    for(i=0;i<7;i++)
    {
        if(letter==pattern[i])
        {
            c++;
            printf("Letter < %c > is found in pattern %s\n",letter,pattern);
            printf("in adress: %p\n",p[i]);
            printf("index:%d\n",i);
        }

    }
    if(c==0)
        printf("The pattern does not include any letter");

  return 0;
}

1 个答案:

答案 0 :(得分:0)

这行代码存在一些容易发生的潜在问题

scanf("%s",&pattern);

你可以像这样使它更安全一点

scanf("%6s",&pattern);

它是6,因为你需要在字符串的末尾添加一个额外的字节'\0',这会将我们带到下一个问题

for(i=0;i<7;i++)

这里假设所有字节都是非nul,除了您正在读取带有scanf()的字符串之外,这将是正常的,除非您创建比您的字符数大一个字节的数组想要存储在其中,scanf()将溢出数组,即写出超出其范围的字节。

"%6s"长度说明符添加到格式字符串可解决此问题,但您只能在数组中存储6nul个字节,而对于另一个问题

for (i = 0 ; pattern[i] != '\0' ; i++)

会更好,因为您不需要提前知道字符串的长度,并且不会冒险读取数组的末尾。

试试这个:

#include <stdio.h>

int main(void)
{
    char  letter;
    char  c;
    int   i; 
    char  pattern[7];
    printf("Enter a letter: ");
    if (scanf(" %c",&letter) != 1)
     {
        printf("error: invalid input.\n");
        return -1;
     }
    printf("Enter a pattern: ");
    if (fgets(pattern, sizeof(pattern), stdin) == NULL)
     {
        printf("error: end of file.\n");
        return -1;
     }
    for (i = 0 ; pattern[i] != 0 ; ++i)
    {
        if (letter == pattern[i])
        {
            c++;
            printf("Letter < %c > is found in pattern %s\n", letter, pattern);
            printf("in adress: %p\n", pattern + i);
            printf("index    :%d\n", i);
        }

    }
    if (c == 0)
        printf("The pattern does not include any letter");
    return 0;
}

你也错误地打印了地址,因为在pointer[i]下标操作符取消引用指针,它等同于*(poitner + i)