我想运行此代码,但我不能。我还没有开始在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;
}
答案 0 :(得分:0)
这行代码存在一些容易发生的潜在问题
scanf("%s",&pattern);
你可以像这样使它更安全一点
scanf("%6s",&pattern);
它是6
,因为你需要在字符串的末尾添加一个额外的字节'\0'
,这会将我们带到下一个问题
for(i=0;i<7;i++)
这里假设所有字节都是非nul
,除了您正在读取带有scanf()
的字符串之外,这将是正常的,除非您创建比您的字符数大一个字节的数组想要存储在其中,scanf()
将溢出数组,即写出超出其范围的字节。
将"%6s"
长度说明符添加到格式字符串可解决此问题,但您只能在数组中存储6
非nul
个字节,而对于另一个问题
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)
。