我正在将字符串参数转换为整数,但遇到一个问题,即第一个参数没有复制并转换为字符串,而第二个参数工作正常。我正在删除字符串数组的第一个字符,并将字符串的其余部分作为 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/