使用char指针与char数组

时间:2017-02-25 23:31:08

标签: c arrays pointers

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

   #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);
}

但是使用char指针,我的程序崩溃了。

#include <stdio.h>
#define N 10

int main() {

int i, count=0;
char *c;
scanf("%s", c);

while(*c != '/0'){
    if( *c == 'e') count++;
    c = c +1;
}
printf("%d", count);
}

是不是可以像这样实现它?

1 个答案:

答案 0 :(得分:0)

为了避免输入缓冲区溢出和由此产生的未定义行为,在使用scanf()格式说明符调用%s时,始终包含一个比输入缓冲区长度小一个的MAX CHARACTERS修饰符。 I.E.这个:

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

注意:exit()EXIT_FAILURE位于stdlib.h

注意:在perror()

中可以找到stdio.h

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