将命令行参数转换为char

时间:2018-04-04 20:56:41

标签: c

我第一次使用命令行参数,我需要将其中一个字符串参数转换为字符进行测试。我尝试将其作为字符串进行测试,但它不起作用。在程序中,用户需要输入e或E或d或D(代码顶部的样本输入)。我对C中的转换做了很多工作,所以任何帮助都会很棒。感谢。

输入为:Class.forName

./filename 4 1 7 e

4 个答案:

答案 0 :(得分:6)

@api.model def create(self, vals): a_id = super(YourClassName, self).create(vals) b_id = self.env['B'].create(vals) # here no one will confirm that both have the same id a_id.many2one_b_id = b_id # so you can execute write and unlink return rec_id @api.muli def write(self,vals): # don't forget using api.multi self can contain more than one record # using mapped is better than looping through records and execute write # one by one. and using api.one have the same effect super(YourClassName, self).write(vals) # using mapped will execute only one update queries for all ids self.mapped('many2one_b_id').write(vals) # mapped will return the list of B record return True @api.multi def unlink(self): # same thing for delete # delete B record first self.mapped('many2one_b_id').unlink() super(YourClassName, self).unlinck() 的类型为argv,因此char **会指定一个指向字符值的指针;这实际上应该给出警告/错误。

如果您想指定第4个参数的第一个字母,请写下char c = argv[4]char c = *(argv[4])

并且不要忘记在访问char c = argv[4][0]之前检查是否有足够的参数提供,即

argv[4]

请进一步注意,if (argc > 4) { char c = *(argv[4]); ... 很少有意义,因为任何if(letter != 'd' || letter != 'D' || letter != 'e' || letter != 'E')条件letter始终为真,因为letter != 'd' || letter != 'D'不能同时为letter和{{1} }} 同时。你可能意味着d ......

答案 1 :(得分:6)

字符串只是一个字符数组,以null结尾。因此,访问数组中的第一个字符:

char letter = argv[4][0];

此外if(letter != 'd' || letter != 'D' || letter != 'e' || letter != 'E')始终为真,因为letter不能同时为d和D.你可能意味着if(letter != 'd' && letter != 'D' && letter != 'e' && letter != 'E')

答案 2 :(得分:3)

添加到当前答案:

public createForm() { this.editForm = this.fb.group({ organizations: this.fb.array( [this.buildOrganization('text')] ) }); } buildOrganization(name: String) { return new FormGroup({ organizationTitle: new FormControl(name), regions: this.fb.array( [this.buildRegion()] ) }) } buildRegion() { return new FormGroup({ regionTitle: new FormControl(''), }) }

此表达式将始终评估为true。我认为您的意思是在这里使用if(letter != 'd' || letter != 'D' || letter != 'e' || letter != 'E')而不是&&

答案 3 :(得分:1)

因为你是C' C'我可以看到你正在努力指点,我会尝试解释argv是什么。实际上argv的类型为char **argv,与char *argv[]相同,与char argv[][]相同。此外,所有参数都以\0与任何C字符串一样终止。

然而,即使您确实理解了指针并修复了这些问题,您也会遇到逻辑错误。有些是答案(@Josh指出这个)

if(letter != 'd' || letter != 'D' || letter != 'e' || letter != 'E')

应该是:

if(letter != 'd' && letter != 'D' && letter != 'e' && letter != 'E')

另一个是: 您想捕获参数的 ONE 字母,并检查其他人是否指出de

char letter = argv[4]; 

应该是

char letter = argv[4][0];

但这会产生另一个问题。如果您输入debug作为您的最后一个参数,那么首字母仍然是' d',但参数不会是' d'如果按照约书亚的建议解决这条问题:

如果argv[4]debug,则代码将失败。你需要做的是检查它是否只是一个字母。

if (argv[4][1] != '\0') {
   printf ("5th argument is incomatible\n");
   return -1;
}

检查参数的第二个字符是' \ 0',这意味着argv [4]只包含一个字母,并以' \ 0'终止。

另一个问题是在检查你是否有足够的参数之前引用。

char letter = argv[4];
if(argc != 5)
{
   printf("Error - wrong number of inputs args\n");
   return -1;
}

/* more code */

如果你幸运的话,这会给你segfautl :)。所以为了避免segfautl它应该是:

if(argc != 5)
{
   printf("Error - wrong number of inputs args\n");
   return -1;
}

char letter = argv[4][0];

/* more code */