首页 > 解决方案 > 使用 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”。

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

谢谢。

标签: cstringmultidimensional-arrayscanf

解决方案


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

char *string[noOfStrings];

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

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

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

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

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

推荐阅读