我试图弄清楚如何将argv[1]
值与几个测试用例进行比较。我想看看argv[1]
是否以特定的char值结尾。到目前为止,我有以下代码:
int main(int argc, char * argv[])
{
char strin[250];
int length;
printf("The argument supplied is %s\n", argv[1]);
strcpy(strin,argv[1]);
length = strlen(strin);
printf("Testing: %c",strin[length]);
if( strin[length] = 'b')
{
printf("b in the input");
}
}
但是出于某种原因,每当我输入任何输入时,print语句就会触发。我如何检查命令行参数中的最后一个字符是否等于我将其设置为等于的字符?
答案 0 :(得分:1)
C数组是基于零索引的。要访问您执行array[0]
的第一个元素,要访问第10个元素array[9]
。
printf("Testing: %c",strin[length]);
这会在字符串中的最后一个字符后打印出字符1,这恰好是空终止符\0
。 (这是C字符串的工作原理)
if( strin[length] = 'b')
{
printf("b in the input");
}
这没有比较,您应该使用==
。这也遇到与上述相同的问题。
因此,请将您的访问权限更改为[length - 1]
并使用==
。
答案 1 :(得分:1)
基本上,您只需要执行以下操作:
int main(int argc, char * argv[]) {
// check if there's an argument to test
if (1 > argc) {
// extract the position of the last character
int last_pos = strlen(argv[1])-1;
// compare the last character with the character "b"
if (0 <= last_pos && 'b' == argv[1][last_pos]) {
printf("Hoora! The input ends with b!");
return 0;
} else {
printf("Bummer… The input does not end with b :(");
}
} else {
printf("there's no argument to test!");
}
}
现在,这里有一个错误摘要:
int main(int argc, char * argv[])
{
char strin[250];
int length;
printf("The argument supplied is %s\n", argv[1]);
// you're doing a copy from the first argument into the
// variable strin. If argv[1] is 251 characters, you'll
// overwrite memory, and will cause a "buffer overflow".
// Whenever you need to do strcpy of data input by a user
// use strncpy().
strcpy(strin,argv[1]);
// you're extracting the /length/ of the string, not the /position/
// of the last character, so when you're trying to access at index
// length, you'll get data from one character beyond the array.
length = strlen(strin);
// so here you're seeing a random value from the memory of your computer
printf("Testing: %c",strin[length]);
// here you made a mistake and you're assigning the value 'b' to the
// value beyond the allocated memory for the array. Basically:
// Here be dragons.
// To avoid that mistake, always put the value you're comparing against
// in a comparaison on the Left Hand Side, and the value you're comparing
// on the right hand side. Then the compiler will yell at you!
if( strin[length] = 'b')
{
printf("b in the input");
}
}
答案 2 :(得分:0)
字符串以0结尾,索引从0开始。但strlen()
不计算终结符。
所以strin[length]
始终是0终结符,需要strin[length - 1]
来获取最后一个字符。当然,如果length > 0
为真,你只能这样做。
C中的比较是使用==
运算符完成的,单=
是赋值,这不是您想要的。
复制字符串也没有意义,您可以直接登记argv[1]
;并strlen()
返回size_t
,而不是int
。
答案 3 :(得分:0)
正如其他人所说的那样,字符串中的最后一个字符是strlen() - 1.你有另一个问题,因为你正在使用strcpy。如果参数字符串中包含超过250个字符,则非常不安全。所以你需要使用strncpy来保证安全。
int main(int argc, char * argv[])
{
char strin[250];
int length;
printf("The argument supplied is %s\n", argv[1]);
strncpy(strin,argv[1], 250);
length = strlen(strin);
printf("Testing: %c",strin[length-1]);
if( strin[length] = 'b')
{
printf("b in the input\n");
}
}