c - 在 C 中创建参数副本的问题

标签 c string int

我正在将字符串参数转换为整数,但遇到一个问题,即第一个参数没有复制并转换为字符串,而第二个参数工作正常。我正在删除字符串数组的第一个字符,并将字符串的其余部分作为 int 打印出来。

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



   int main(int argc, char *argv[])
   {


    char numcpy1[sizeof(argv[1])-1];
    char numcpy2[sizeof(argv[2])-1];

    int  i, len1, len2;

    int result1=0;
    int result2=0;


    //Access first character for base
    printf("%c \n", argv[2][0]);
    printf("%c \n", argv[3][0]);


    //Remove first character for number1 and number 2
    if(strlen(argv[2]) > 0)
    {
         strcpy(numcpy1, &(argv[2][1]));
    }
    else
    {
         strcpy(numcpy1, argv[2]);
    }
    len1 = strlen(numcpy1);

    if(strlen(argv[3]) > 0)
    {
         strcpy(numcpy2, &(argv[3][1]));
    }
    else
    {
         strcpy(numcpy2, argv[3]);
    }
    len2 = strlen(numcpy2);

    //Turn remaining string characters into an int
    for(i=0; i<len1; i++)
    {
         result1 = result1 * 10 + ( numcpy1[i] - '0' );
    }

    for(i=0; i<len2; i++)
    {
         result2 = result2 * 10 + ( numcpy2[i] - '0' );
    }

    printf("%d \n", result1);
    printf("%d \n", result2);


    return 0;

}

输出:

b
b
-4844
1010

我想要什么:

b
b
1000
1010

最佳答案

sizeof 运算符并不像您想象的那样给出字符串的长度。它告诉您数据类型的大小。由于 argv[2]char *,因此计算结果为该指针的大小,很可能为 4 或 8,具体取决于系统。

如果相关字符串比该值长,则最终会超出数组末尾。这会调用 undefined behavior ,在您的情况下,这表现为意外结果。

如果您想要字符串的长度,请使用 strlen 函数。另外,您还需要添加一个字节。 C 中的字符串以 null 结尾,因此您需要为标记字符串结尾的 null 字节留出空间。

char numcpy1[strlen(argv[2])];
char numcpy2[strlen(argv[3])];

另请注意,我们不需要为每个字符串添加 1,因为不会复制每个字符串中的第一个字符。

关于c - 在 C 中创建参数副本的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45090009/

相关文章:

c++ - 7-Zip : Any good tutorials?

java - 在字符串中附加扩展的 ascii

ruby - 轨道 3 : is there way to automatically create a hash from a string representation of a hash

c - 为什么我的文本无法打印?

haskell - 在 Haskell 中打印时将 Float 格式化为 Int

Java实例变量的内存分配

c - 我的 'NumberSize' 函数中的二进制操作数无效

C编程-如何将输出图片文件设置为.pgm格式?

c - 二进制文件写入问题

python字节(some_string, 'UTF-8')和str(some_string, 'UTF-8')