字符串指针与字符串数组的问题

lishangzcq 2015-01-07 12:11:48
在VS 2010上运行以下C代码:

void main(){
char st[20],*ps;
int i;
printf("input a string:");
ps=st;
scanf_s("%s",ps);

for(i=0;ps[i]!='\0';i++)
if(ps[i]=='k'){
printf("there is a 'k' in the string\n");
break;
}
if(ps[i]=='\0')
printf("There is no 'k' in the string\n");
system ("pause");
//return 0;
}


程序是判断输入的字符串中有无'k'字符
发现得不到正确结果,无论输入的字符串带不带'k'都是输出"There is no 'k' in the string\n"

如下运行截图:


单步调试的情况:


也就是程序运行到这行
ps=st;
代码的时候出现了错误,但是本身程序不报错,只是得不到正确结果

这句将字符串数组首地址赋值给字符串指针的表达式无法计算是什么意思?菜鸟表示深深的不理解

还请高手指教
...全文
246 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Evankaka 2015-01-07
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <cstdlib>
void main(){
char st[20],*ps;
int i;
printf("input a string:");
scanf("%s",st);//改用scanf,直接给数据赋值
ps=st;//指针指向数组首地址
for(i=0;ps[i]!='\0';i++)
if(ps[i]=='k'){
printf("there is a 'k' in the string\n");
break;
}
if(ps[i]=='\0')
printf("There is no 'k' in the string\n");
system ("pause");
}

此后三年 2015-01-07
  • 打赏
  • 举报
回复
	
char st[20],*ps;  //定义了一个数组, 以及一个指针
	int i;
	printf("input a string:");
	ps=st; //数组名也等于一个指针, 赋值之后ps可以操作st这个数组的内容
	scanf("%s",ps);  //这里不要用scanf_s(); 不具备通用性, scanf()才是标准C的函数

	for(i=0;ps[i]!='\0';i++)  //for循环要加大括号, 否则第二个if不在for循环的作用域中
	{
		if(ps[i] == 'k'){
			printf("there is a 'k' in the string\n");
			break;
		}
		if(ps[i]=='\0')
			printf("There is no 'k' in the string\n");
	}
fly_dragon_fly 2015-01-07
  • 打赏
  • 举报
回复
scans_s 要么指定长度,要么传入数组名,直接传指针不行的 scanf_s("%s", st)
吴一奇 2015-01-07
  • 打赏
  • 举报
回复
把“scanf_s("%s",ps);”改成“scanf_s("%s",ps,20);”或者“scanf("%s",ps);”
lishangzcq 2015-01-07
  • 打赏
  • 举报
回复
引用 2 楼 fly_dragon_fly 的回复:
scans_s 要么指定长度,要么传入数组名,直接传指针不行的 scanf_s("%s", st)
用scanf_s的话确实要指定长度,直接传入指针或数组名都无法得到正确结果
lishangzcq 2015-01-07
  • 打赏
  • 举报
回复
引用 6 楼 adusuccessfully 的回复:
另外

char st[20],*ps;
    int i;
    printf("input a string:");
    ps=st;
    scanf_s("%s",ps);
我觉得可以简化,没有必要再定义一个指针:

char ps[20];
	int i;
	printf("input a string:");
	//scanf("%s",ps);
	scanf_s("%s",ps,20);
嗯,如果优化代码确实是这样,我因为是想把指针学得透彻一点。所以才把代码写成这样
lishangzcq 2015-01-07
  • 打赏
  • 举报
回复
感谢各位的不吝赐教~ 自己也验证了一下:把
scanf_s("%s",ps);
这行代码改成
scanf("%s",ps);
程序可以得出正确结果,但是依然会有一个安全警告,如果不喜欢可以改成
scanf_s("%s",ps,20);
或者
scanf_s("%s",st,20);
程序都可运行出正确结果
动力风暴 2015-01-07
  • 打赏
  • 举报
回复
另外

char st[20],*ps;
    int i;
    printf("input a string:");
    ps=st;
    scanf_s("%s",ps);
我觉得可以简化,没有必要再定义一个指针:

char ps[20];
	int i;
	printf("input a string:");
	//scanf("%s",ps);
	scanf_s("%s",ps,20);
动力风暴 2015-01-07
  • 打赏
  • 举报
回复
我试了,一楼的解答是正确的~~~

#include <stdio.h>
#include <cstdlib>
void main(){
	char st[20],*ps;
	int i;
	printf("input a string:");
	ps=st;
	//scanf("%s",ps);
	scanf_s("%s",ps,20);
	for(i=0;ps[i]!='\0';i++)
		if(ps[i]=='k'){
			printf("there is a 'k' in the string\n");
			break;
		}
	if(ps[i]=='\0')
		printf("There is no 'k' in the string\n");
	system ("pause");
		//return 0;
}
百度一下scanf_s,得知:很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时hacker可以利用原版的不安全性黑掉系统。比如:char d[20];写成scanf_s("%s",d,20);才是正确的,有这个参数20使准确性提高。 学习了~~~

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧