c - 使用 scanf 将字符串存储到字符串数组中
问题描述
尝试使用以下代码将输入存储到字符串数组中:
#include <stdio.h>
#include <string.h>
int main()
{
int noOfStrings;
printf("Enter no of strings: ");
scanf("%d", &noOfStrings);
char *string[noOfStrings];
for(int i=0; i<noOfStrings; i++){
printf("\nEnter string %d: ", i);
scanf("%s\n",string[i]);
}
return 0;
}
-----------------------------------------------------------------------------
Console:
Enter no of strings: 3
Enter string 0: abc
Enter string 1: def
Enter string 2: ghi
Segmentation fault (core dumped)
...Program finished with exit code 139
Press ENTER to exit console.
-----------------------------------------------------------------------------
我无法弄清楚为什么这会失败。
我还尝试了以下具有固定大小数组的代码。
#include <stdio.h>
#include <string.h>
int main()
{
int noOfStrings;
printf("Enter no of strings: ");
scanf("%d", &noOfStrings);
char string[noOfStrings][5];
for(int i=0; i<noOfStrings; i++){
printf("\nEnter string %d: ", i);
scanf("%s\n",string[i]);
}
printf("\nPrinting Stored Strings");
for(int i=0; i<noOfStrings; i++){
printf("\nEnter string %d: ", i);
printf("%s\n",string[i]);
}
return 0;
}
-----------------------------------------------------------------------------
Console:
Enter no of strings: 3
Enter string 0: abc
def
Enter string 1: ghi
Enter string 2: jkl
Printing Stored Strings
Enter string 0: abc
Enter string 1: def
Enter string 2: ghi
...Program finished with exit code 0
Press ENTER to exit console.
输入第一个字符串('abc')后没有提示输入第二个字符串,所以继续输入'def'。其次是另外 2 个字符串。请注意,未打印字符串“jkl”。
请告诉我在这两种情况下我缺少什么?
谢谢。
解决方案
在第一种情况下,您要定义一个指针数组:
char *string[noOfStrings];
但是,这些指针未初始化。然后,当您尝试使用scanf
时,您取消引用这些无效指针。这样做会调用未定义的行为,在这种情况下会导致崩溃。
您的第二种情况通过使用足够大的二维字符数组来保存您输入的字符串来解决此问题。但是由于您的scanf
格式,您会陷入困境:
scanf("%s\n",string[i]);
格式字符串中的\n
匹配任意数量的空白字符,因此在您输入非空白字符之前,该函数不会返回。您可以通过\n
从格式字符串中删除来解决此问题。
scanf("%s",string[i]);
推荐阅读
- django - cpanel中的OpenCv videoCapture(从应用程序收到不完整的响应)
- c++ - 我正在尝试“构建并运行”一个 c++ 项目 main.cpp,但出现以下编译器错误
- php - PHP 中的字符串比较没有意义……
- asp.net-mvc - 在 MVC 5 Razor 页面中实现 bootstrap.chosen
- http - 支持 Heroku 通用运行时基础的 Heroku DNS 配置返回错误
- tinymce - 上下文菜单中的 TinyMCE 图像选项未显示
- java - 为什么我的共同偏好显示不同的值?
- javascript - Chrome 扩展程序:在同一台计算机中跨多个 chrome 配置文件进行通信/调用操作
- model-checking - Broker模式CCS建模和Mu演算规范
- api - 关于 Flutter/Dart 中的 JSON 解码:复杂的 JSON API 转化为模型