Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中读取字符串数组_C_Input_Segmentation Fault_Scanf_Stdin - Fatal编程技术网

在C语言中读取字符串数组

在C语言中读取字符串数组,c,input,segmentation-fault,scanf,stdin,C,Input,Segmentation Fault,Scanf,Stdin,我需要从每个字符串中的2个字母中读取n个字符串的数组(例如,n=3,需要读取“ab-bf-cs”附近的内容)。我使用此代码并得到分段错误: int n; scanf("%d", &n); char array[n][2]; char *tmp; for (int i = 0; i < n; i++) { scanf("%s", &tmp); strcpy(array[i], tmp); } intn; scanf(“%d”和“&n”); 字符数组[n][2

我需要从每个字符串中的2个字母中读取n个字符串的数组(例如,n=3,需要读取“ab-bf-cs”附近的内容)。我使用此代码并得到分段错误:

int n;
scanf("%d", &n);
char array[n][2];
char *tmp;
for (int i = 0; i < n; i++)
{
    scanf("%s", &tmp);
    strcpy(array[i], tmp);
}
intn;
scanf(“%d”和“&n”);
字符数组[n][2];
char*tmp;
对于(int i=0;i

请帮我修一下

问题1

要存储长度为2的字符串,需要大小为3的
char
数组。使用:

char array[n][3];
问题2

您正在调用
scanf
时使用
&tmp
。这在两个方面是错误的

  • 类型不合适。
    &tmp
    的类型是
    char**
    scanf
    需要一个带有
    %s
    格式说明符的
    char*

  • &tmp
    无法保存字符串

  • 你可以用

    scanf("%s", tmp);
    
    从类型的角度来看,这是可以的,但从运行时的角度来看,这是不可以的,因为
    tmp
    没有指向任何有效的内容

    您可以完全取消
    tmp
    ,并使用:

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

    整个代码块可以是:

    int n;
    scanf("%d", &n);
    char array[n][3];
    for (int i = 0; i < n; i++)
    {
        // Make sure you don't read more than 2 chars.
        scanf("%2s", array[i]);
    }
    
    intn;
    scanf(“%d”和“&n”);
    字符数组[n][3];
    对于(int i=0;i
    这里有几件事需要解决

  • 请记住,一个“字符串”(
    char[]
    )总是以空终止字符结尾
    \0
    。因此,无论何时创建
    char[]
    ,都必须为其留出足够的空间。例如:

    scanf("%s", array[n]);
    
    charstr[3]=“foo”
    看起来像
    ['f','o','o']
    ,但是

    charstr[4]=“foo”看起来像
    ['f','o','o','\0']

    使用前者时可能会出现意外后果

    这意味着您应该将
    字符数组[n][2]
    更改为
    字符数组[n][3]

  • 记住这一点。若要使用指针,必须为其分配内存,否则极有可能出现seg故障

    在您的程序中,它非常简单,您可能不需要使用指针,特别是因为您知道要存储的每个字符串的长度(2)

    您可以将
    char*tmp
    更改为
    char tmp[3]

  • 实际上,您可以重构代码,因此根本不需要
    tmp
    变量。如果需要,可以直接将读取的单词存储到数组中。例如:

    scanf("%s", array[n]);
    
  • 如果您确实坚持使用
    tmp
    变量作为
    char*
    ,请为其分配内存,如下所示:

    char *tmp = (char*)malloc(3 * sizeof(char));
    
  • 作为旁注,如果您遵守ISO C90标准,您不应该在代码中混合变量声明,因此在您有
    for(int i=0…
    )的循环中,您应该声明
    int i位于文件顶部,然后在循环中为(i=0…)分配它


  • 首先,正如user3121023在评论中指出的,
    char*tmp创建没有分配内存的指针。scanf()需要一个数组,您需要为终止的
    '\0'
    留出空间(这可能是分段错误的根源)。所以您可以尝试
    scanf(“%s”,array[i])

    其次,最好使用
    “%2s”
    而不是
    “%s”
    ,这样用户就不会输入3位数字并使缓冲区溢出

    这里有一个解决方案

    int n;
    scanf("%d", &n);
    char array[n][3];
    for (int i = 0; i < n; i++)
    {
        scanf("%2s", array[i]);
    }
    
    intn;
    scanf(“%d”和“&n”);
    字符数组[n][3];
    对于(int i=0;i
    不同意“除了常量或整数文字外,不能声明任何大小的数组。”C99和可选的C11允许可变长度数组。谢谢。我不知道。我已经更新了我的答案。
    char*tmp=(char*)malloc(3*sizeof(char))
    可以简化为
    char*tmp=malloc(3)
    char*tmp=malloc(sizeof*tmp*3)