我想写一个简单的程序,它读取一个单词并打印次数,即字母" 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);
}
是不是可以像这样实现它?
答案 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()