C 使用字符指针与字符数组

C 使用字符指针与字符数组,c,arrays,pointers,C,Arrays,Pointers,我想写一个简单的程序,它读取一个单词并打印字母“e”被使用的次数。当我用一个字符数组实现我的程序时,它就工作了 #include <stdio.h> #define N 10 int main() { int i, count=0; char c[N]; scanf("%s", c); for (i=0;i<N;i++){ if( c[i] == 'e') count++; } printf("%d", count); } #包括 #定义n1

我想写一个简单的程序,它读取一个单词并打印字母“e”被使用的次数。当我用一个字符数组实现我的程序时,它就工作了

   #include <stdio.h>
   #define N 10

int main() {

int i, count=0;
char c[N];

scanf("%s", c);

for (i=0;i<N;i++){
    if( c[i] == 'e') count++;
   }
printf("%d", count);
}
#包括
#定义n10
int main(){
int i,计数=0;
字符c[N];
scanf(“%s”,c);

对于(i=0;i为避免输入缓冲区溢出和由此产生的未定义行为,当使用
%s
格式说明符调用
scanf()
时,始终包括一个小于输入缓冲区长度的最大字符修饰符。即:

scanf("%s", c);
应该是:

scanf("%9s", c);
此外,始终检查返回值(而不是参数值),以确保操作成功。在当前场景中:

if( 1 != scanf( "%9s", c) ) 
{
    perror( "scanf for string failed" );
    exit( EXIT_FAILURE );
}

// implied else, scanf successful
代码的第二个版本(除上述版本外)的问题在于声明:

char *c;
只定义指针,不定义指针指向的位置

建议添加代码块:

if( NULL == (c = malloc( N ) ) )
{
    perror( "malloc failed" );
    exit( EXIT_FAILURE );
}

// implied else, malloc successful
注意:
stdlib.h

注意:
perror()
位于
stdio.h


当然,由于代码执行了一个
malloc()
,然后在代码中任何稍后退出的点,它也应该将指针传递到
free()

不,不是。/15char您需要分配内存来存储在指针中。阅读
malloc()
\0
vs
/0
-斜杠的方向很重要!不,你的第一个版本也不起作用。试着键入“AEEEEEE”(溢出缓冲区)或“ee”(任意结果)谁说指针==数组?尽管很多人认为是这样,但事实并非如此。
if( NULL == (c = malloc( N ) ) )
{
    perror( "malloc failed" );
    exit( EXIT_FAILURE );
}

// implied else, malloc successful