体弱多病程序权 发表于 2019-4-13 22:47:14

关于二维字符型数组用scanf取值问题!在线等,很急的


#include <stdio.h>
int main(void)
{
        int n;
        char s[]={0};
        while(scanf("%d",&n)==1) //输入n,表示要输入的字符串个数
        {
                for(int i = 0;i<n;i++)
                        scanf("%s",&s);//对二维数组赋值
        }       
                printf("%c\n",s);//输出二维字符型数组中的某个元素
}
结果见图1
但是当我开始就定义好了行和列s程序就正常了。这是为什么?如果是当成s不因该程序一运行就runtime error吗?

jackz007 发表于 2019-4-13 23:17:09

    试试这个代码:
#include <stdio.h>

int main(void)
{
      int i , n                                       ;
      char s = {0}                        ;
      scanf("%d" , & n)                               ;
      for(i = 0 ; i < n ; i ++) scanf("%s" , s)    ;
      printf("\n")                                    ;
      for(i = 0 ; i < n ; i ++) printf("%s\n" , s) ;
      printf("%c\n" , s)                        ;
}

体弱多病程序权 发表于 2019-4-13 23:44:54

jackz007 发表于 2019-4-13 23:17
试试这个代码:

我是想知道明明C语言可以在定义二维数组进行初始化时不需要填写第一个维度,为什么不能进行赋值?你的代码我知道可以但不是我想要的答案

jackz007 发表于 2019-4-14 09:22:25

本帖最后由 jackz007 于 2019-4-14 09:36 编辑

体弱多病程序权 发表于 2019-4-13 23:44
我是想知道明明C语言可以在定义二维数组进行初始化时不需要填写第一个维度,为什么不能进行赋值?你的代 ...

      首先应该明确,你的代码在运行中已经发生了数组访问越界,从而伤害到了程序代码,所以才会出现异常。其直接原因,就是数组 s[][] 容量定义过小造成。
      二维数组定义不填写第一个维度是有前提条件的,那就是必须通过初始化赋值,也就是通过元素或元素组的实际数量来间接明确这个维度。
      事实证明,以图省事,企图把麻烦交给计算机为动机的偷懒,最后都不可能绕过和解决问题。
      例如,用下面的方法也可以省略第一维度的定义,但是感觉是在自找麻烦
      char s[] = {{0} , {0} , {0} , {0} , {0} , {0} , {0} , {0} , {0} , {0}} ;。
      把这个定义换到你的代码中试试看,是不是也可以避免出现问题?
页: [1]
查看完整版本: 关于二维字符型数组用scanf取值问题!在线等,很急的