【问题标题】:Can't copy a part of a string无法复制字符串的一部分
【发布时间】:2016-10-03 13:34:02
【问题描述】:

我想知道如何将字符串的一部分复制到另一个字符串中,所以我查看了这个网站,看看是否可以得到答案,我做到了:How can I copy part of another string in C, given a starting and ending index

但是,当我使用这个时

strncpy(dest, src + beginIndex, endIndex - beginIndex);

在我的代码上,它不起作用。为什么?我想我已经正确添加了索引。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#define MAX 15

int main()
{
    int j=0;
    int i;
    char RPNarray[MAX];
    printf("Enter the RPN");
    fgets(RPNarray,MAX,stdin);
    int t=strlen(RPNarray);
    double RPN[t][2];

    for(i=0;i<=t;i++)
    {
        if(isspace(RPNarray[i]))
        {
            i=i+1;
        }
        else if (isdigit(RPNarray[i]))
        {
            int q,h;
            q=i;
            for (h=i;isdigit(RPNarray[h]);h++)
            {
                h=h+1;
            }
            int r;
            double u;
            r=h-q;
            char number[r];
            printf("%s ", RPNarray);
            strncpy(number,RPNarray + q,h - q);
            printf ("%s\n",number);
            u=atof(number);
            printf("%lf.\n",u);
            RPN[j][0]=0;
            RPN[j][1]=u;
            i=i+1;
            j=j+1;
        }
    }
    int b;
    for (b=0;b<=j;b++)
    {
        printf("%lf %lf \n",RPN[b][0],RPN[b][1]);
    }
}

r是数字的位数,q是数字的第一个数字的位置,h是非数字的数字后面的第一个位置。

这个程序应该像代码所说的那样打印 RPN 矩阵。

 (0,(first number we introduce via stdin)
 (0,(second number we introduce via stdin)
 (0,(third number we introduce via stdin)

我还添加了更多打印以查看问题出在哪里,如您所见,第二次打印没有按应有的方式打印。

如果输入是:

56 6 
The output is:
56 6
 56OT?
56.000000.
vector 0.000000 56.000000 
vector 0.000000 0.000000

我该怎么做才能输出:

56 6
 56
56.000000.
56 6
 6
6.000000.
vector 0.000000 56.000000 
vector 0.000000 6.000000

谢谢

【问题讨论】:

  • 请编辑您的帖子并修正缩进。
  • 了解如何使用调试器,并逐行执行代码。
  • 循环结束条件&lt;= 可疑。在第一个 t 超过了字符串的长度。在第二个中,b 正在索引RPN[b] 的一个元素,该元素尚未设置为j 的当前值,该值在使用后递增。
  • 为了便于阅读和理解:1) 一致地缩进代码 2) 变量名应该指示内容或用法(或更好,两者兼而有之) 3) 单独的代码块(for、if、else、while、 do...while, switch, case, default) 通过一个空行。
  • 不要#include头文件那些内容没有被使用。 IE。不包括 math.h

标签: c arrays numbers digit strncpy


【解决方案1】:

也许您只需要continue 而不是递增?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>

#define MAX 15

int main() {

    int j = 0;
    int i;
    char RPNarray[MAX];
    printf("Enter the RPN");
    fgets(RPNarray, MAX, stdin);
    int t = strlen(RPNarray);
    double RPN[t][2];

    for (i = 0; i <= t; i++) {
        if (isspace(RPNarray[i])) {
            continue;//i = i + 1;
        }
        else if (isdigit(RPNarray[i])) {
            int q, h;
            q = i;
            for (h = i; isdigit(RPNarray[h]); h++) {
                h = h + 1;
            }
            int r;
            double u;
            r = h - q;
            char number[r];
            printf("%s ", RPNarray);
            strncpy(number, RPNarray + q, h - q);
            printf("%s\n", number);
            u = atof(number);
            printf("%lf.\n", u);
            RPN[j][0] = 0;
            RPN[j][1] = u;
            i = i + 1;
            j = j + 1;
        }
    }
    int b;
    for (b = 0; b <= j; b++) {
        printf("%lf %lf \n", RPN[b][0], RPN[b][1]);
    }
}

测试

Debug/gnu
Enter the RPN56 6
56 6
 56
56.000000.
56 6
 6

6.000000.
0.000000 56.000000 
0.000000 6.000000 
0.000000 0.000000 

它看起来像你想要的输出。我所做的只是改变一个陈述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2011-03-01
    • 1970-01-01
    • 2018-05-23
    • 2017-01-11
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多