【问题标题】:To store character by character in String array在字符串数组中逐个字符存储
【发布时间】:2013-01-21 06:46:15
【问题描述】:

我想写一个c程序,根据运算符拆分“23 * 34”字符串,并将数字单独存储为字符串数组中的单独字符串。我是以下代码。

struct exp_details
{
        char operator[10];
        char *number[10];
}ed;

int split(int m,int n,char *str) /*m for operator index, n for str index */
{
        int i,j=0;
        for(i=n;(str[i] != ed.operator[m]) && (str[i] != '\0');i++,j++)
        {
                ed.number[m][j] = str[n];
        }
        if(str[i] != '\0')
        {
                split(m++,i++,str);
        }
        else
                return 1;
        return 0;
}

但此编码显示分段错误。它正在运行到

ed.number[m][j] = str[n];

这个声明。我认为这个声明只会引起问题。我想,我的逻辑是正确的。但我不知道如何纠正它。请帮我。提前谢谢你。

【问题讨论】:

    标签: c string segmentation-fault storing-data


    【解决方案1】:

    您似乎没有初始化j

    【讨论】:

    • 输出并没有什么不同。
    • j 似乎已初始化:int i,j=0;
    【解决方案2】:

    您可能需要在 for 循环中初始化 j:-

    for(i=n, j = 0;(str[i] != ed.operator[m]) && (str[i] != '\0');i++,j++)
    

    另外,我发现您的递归调用存在一些问题。在下面的声明中:-

    split(m++,i++,str);
    

    您正在为operator index 传递值m++。因此,在这里您假设字符串中的运算符将按照它们在char operator[10] 数组中列出的顺序出现。这是完全错误的。

    例如:-

    如果您的运算符数组包含: - {'*', '+', '/', '-'}。您的字符串是:-23*45-30+29,然后当您在第一个运算符 -* 上拆分字符串时,然后在下一次调用时,您将 + 作为运算符传递,因为它在您的 operator array 中排在第二位。现在,在下一次运行中,您的循环将迭代直到它在您的字符串中找到 +,因此它将在您的 numbers 数组中添加 - 45-30。所以,这里有错误。

    您可能需要在迭代时测试字符串中的每个字符,无论它是否存在于operator 数组中。否则,您最终也会在您的 numbers 数组中存储一些 operators

    【讨论】:

      【解决方案3】:

      这里的增量是没有意义的

       split(m++,i++,str);
      

      由于 m 和 i 是本地的,并且您在调用 split() 函数之后递增它们。

      您还应该在对数组寻址时检查边界,确保它们在有效范围内 范围即 0..9

      assert( m >= 0 && m <= 9 );
      assert( j >= 0 && j <= 9 );
      assert( n >= 0 && n <= 9 );
      
      ed.number[m][j] = str[n]
      

      最好还是为你的数组设置一个常量

      #define MAXSIZE 10
      
      struct exp_details
      {
              char operator[MAXSIZE];
              char *number[MAXSIZE];
      } ed;
      
      ...
      assert( m >= 0 && m < MAXSIZE );
      assert( j >= 0 && j < MAXSIZE );
      assert( n >= 0 && n < MAXSIZE );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-22
        • 2017-04-08
        • 2016-03-17
        • 2013-07-07
        • 2012-05-12
        • 1970-01-01
        • 2023-04-07
        相关资源
        最近更新 更多