【问题标题】:Store strings into array of strings with scanf使用 scanf 将字符串存储到字符串数组中
【发布时间】:2019-07-02 01:12:00
【问题描述】:

尝试使用以下代码将输入存储到字符串数组中:

#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' 没有打印出来。

请告诉我在这两种情况下我缺少什么?

谢谢。

【问题讨论】:

  • 在第一种情况下,您声明指针数组,并且在取消引用之前需要为每个指针分配内存。
  • @xing 我尝试在两种情况下都删除 \n 我得到以下输出:案例 1- 输入字符串数量:3 输入字符串 0:abc def 输入字符串 1:ghi 输入字符串 2:jkl打印存储的字符串 输入字符串 0:abc 输入字符串 1:def 输入字符串 2:ghi 案例 2- 输入字符串数量:3 输入字符串 0:abc def 输入字符串 1:ghi 输入字符串 2:jkl 打印存储的字符串 输入字符串 0: abc 输入字符串 1:def 输入字符串 2:ghi
  • 每次您使用*scanf() 读取用户输入并且不检查返回值时,都依赖于用户调用程序的未定义行为。不要那样做。
  • @DevSolar 明白了:)
  • @xing 我这边的错误建议更改解决了这个问题。谢谢

标签: c string multidimensional-array scanf


【解决方案1】:

在第一种情况下,您定义了一个指针数组:

char *string[noOfStrings];

但是,这些指针未初始化。当您尝试使用scanf 时,您取消引用这些无效指针。这样做会调用undefined behavior,在这种情况下会导致崩溃。

您的第二种情况通过使用足够大的二维字符数组来保存您输入的字符串来解决此问题。但是由于scanf 格式,您会卡住:

scanf("%s\n",string[i]);

格式字符串中的\n 匹配任意数量的空白字符,因此在您输入非空白字符之前,该函数不会返回。您可以通过从格式字符串中删除 \n 来解决此问题。

scanf("%s",string[i]);

【讨论】:

  • 我尝试在两种情况下都删除 \n 我得到以下输出:案例 1-输入字符串数量:3 输入字符串 0:abc def 输入字符串 1:ghi 输入字符串 2:jkl 打印存储字符串 输入字符串 0:abc 输入字符串 1:def 输入字符串 2:ghi 案例 2- 输入字符串数量:3 输入字符串 0:abc def 输入字符串 1:ghi 输入字符串 2:jkl 打印存储的字符串 输入字符串 0:abc 输入字符串 1:def 输入字符串 2:ghi
  • @sdnemina 除了 cmets 中的格式不佳之外,这看起来是正确的。这与您的预期有何不同?
  • 请注意,我必须在“输入字符串 1”之前输入 def,并且还必须在输出中输入“jkl”,它显示打印存储的字符串输入字符串 0:abc 输入字符串 1:def 输入字符串 2 : 吉。也对格式以及在打印输出时使用“输入字符串”表示歉意。
  • @dbug 我这边的错误,建议的更改解决了这个问题。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-11-23
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 2017-02-11
  • 1970-01-01
相关资源
最近更新 更多