c - 直接使用 Printf 打印字符串(字符指针) - 奇怪的行为
问题描述
在下面的 c 代码中,删除 ln8 和 lb9 时,“第 10 行”不打印任何内容。它只接受输入并且不打印任何内容。但奇怪的是添加了这两行代码,代码工作得非常好,即输入字符串被 for 循环打印两次,一次被 ln10 中的 printf 语句打印。(我想做的只是打印输入字符串)我使用 MinGw 编译器并使用 cmd 运行代码。在此处输入图像描述
int main()
{
char *s;
scanf("%s",s);
printf("Line 9:\t");
for(int i=0;s[i]!='\0';i++) //line 8
printf("%c",*(s+i)); //line 9
printf("\nLine 12:\t%s\n",s); //line10
return 0;
}
解决方案
char *s
您声明了一个指针,但不为其分配。它是未定义的。因为未定义的行为,一切都可能发生。(例如,当我在我的电脑上测试你的程序时,它会引发Segmentation fault (core dumped)
您必须在 scanf 之前为指针分配(不要忘记在s
不需要使用时释放它):
char *s = malloc(sizeof(char) * MAX_LEN); // MAX_LEN: you define its value.
或者您可以使用字符数组:
char s[100]; // here, the string length is up to 99;
推荐阅读
- javascript - 不使用动画的 HTML/JS 轮播
- java - 超类变量如何保存仅存在于子类中的数据成员值?
- swift - 在 Square Reader SDK 中允许用户定义的金额
- python - Python 将时间、纬度和经度分配给来自 netcdf 文件的 xarray.DataSet 的“维度”
- arrays - 使用下一个运算符后迭代数组不移动到下一个对象
- c++ - 使用 C++ 项目将数据保存在磁盘上
- python - 如何根据 Pandas 数据框的条件增加计数器?
- machine-learning - 机器学习非线性假设
- recursion - Prolog递归累加器
- json - Scala:使用 find() 或 filter() 根据多个键值读取地图的内部图