定义char str[100]时scanf传入&str不生效,求语法问题排查
代码存在的问题及修复方案
问题列表
- length函数变量未初始化:自定义
length函数中,局部变量len声明后未赋值为0,初始值为内存随机值,导致字符串长度计算逻辑完全错误。硬编码字符串时运行正常属于巧合,刚好栈内存中len初始值为0,改用scanf输入后栈内存布局变化,逻辑就会失效。 - scanf参数用法错误:
main函数中scanf("%s",&str);写法错误,数组名str本身已经是字符数组的首地址,不需要额外加取地址符&。 - 存在缓冲区溢出风险:
%s不限制输入长度时,若输入字符超过99个会超出str数组的存储范围,触发栈溢出漏洞。
修复后的完整代码
#include<stdio.h> // 查找字符串中的重复字母 int length(char str[]) // 计算字符串长度 { int len = 0; // 初始化len为0 while(str[len]!='\0') { len++; } return len; } void duplicate(char str[],int n) { int i,j,flag; for(i=0;i<=n-2;i++) // 选中要比较的字符 { flag=0; if(str[i]!='\0') { for(j=i+1;j<=n-1;j++) // 遍历后续字符对比 { if(str[j]==str[i]) { flag=1; str[j]=0; } } if(flag==1) { printf("%c 是重复字符\n",str[i]); } } } } int main() { char str[100]; scanf("%99s",str); // 修正scanf写法,限制输入长度 int n= length(str); duplicate(str,n); return 0; }
内容的提问来源于stack exchange,提问作者Vedant Taak
相关产品推荐
相关产品推荐

