Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的字符数组指针_C - Fatal编程技术网

C语言中的字符数组指针

C语言中的字符数组指针,c,C,我想运行此代码,但我不能。我还没有开始学习C语言中的指针。我正在尝试获取字母的地址。问题是printf(“地址:%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);

我想运行此代码,但我不能。我还没有开始学习C语言中的指针。我正在尝试获取字母的地址。问题是printf(“地址:%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;
}
#包括
内部主(空){
字符字母;
int c=0;
int i;
字符模式[7];
char*p;
printf(“输入字母:”);
scanf(“%c”和字母);
printf(“输入模式:”);
扫描频率(“%s”,模式);
p=模式;

对于(i=0;i这行代码有一些很容易发生的潜在问题

scanf("%s",&pattern);
你可以让它像这样安全一点

scanf("%6s",&pattern);
这是一个
6
,因为您需要在字符串末尾多加一个字节
'\0'
,这就引出了下一个问题

for(i=0;i<7;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;
}
#包括
内部主(空)
{
字符字母;
字符c;
int i;
字符模式[7];
printf(“输入字母:”);
如果(scanf(“%c”,&字母)!=1)
{
printf(“错误:无效输入。\n”);
返回-1;
}
printf(“输入模式:”);
if(fgets(pattern,sizeof(pattern),stdin)=NULL)
{
printf(“错误:文件结束。\n”);
返回-1;
}
对于(i=0;模式[i]!=0;++i)
{
if(字母==模式[i])
{
C++;
printf(“在模式%s\n中找到字母<%c>”,字母,模式);
printf(“地址:%p\n”,模式+i);
printf(“索引:%d\n”,i);
}
}
如果(c==0)
printf(“图案不包括任何字母”);
返回0;
}

您还打印了错误的地址,因为在
指针[i]
中,下标运算符取消了指针的引用,它相当于
*(poitner+i)

q1.c:在函数“main”中:q1.c:12:2:警告:格式“%s”要求参数类型为“char”,但参数2的类型为“char()[7]”[-Wformat=]scanf(%6s),&pattern);^q1.c:20:4:警告:格式“%p”要求参数类型为“void*”,但参数2的类型为“int”[-Wformat=]printf(“在地址:%p\n”,p[i]);我现在有这些错误问题是
和pattern
,使用警告很好,学习的一个好方法是尝试解释警告和错误,并思考为什么它不能像您编写的那样工作。请使用
fgets()
,正如我发布的代码
p[I]
不是p的第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;
}