问题描述
我正在编写一个C程序,该程序从 .txt 文件读取表数据,对其进行更改,然后将修改后的表打印到另一个 .txt 文件中。该程序的一部分是在 irow 参数之后在终端中输入的行之前打印并空行的功能。程序的编译和运行方式如下:
gcc -Wall -Wextra -Werror -o main main.c
./main irow [row] <tab1.txt >tab2.txt
处理输入的程序的一部分:
int insertRow(char*argv[],int row_number) {
row_number = 0;
for(int i = 0; argv[i]; i++) {
if ( isdigit(argv[i][0]) && (strcmp(argv[i - 1],"irow") == 0))
if((argv[i][0] - '0') > 0)
row_number = argv[i][0] - '0';
}
return row_number;
}
然后在主要方法中使用 row_number 对表进行更改。
代码可以正常工作并执行应有的功能,但是我还没有找到一种更好的方法来从参数向量中读取 [row] 参数。如何不仅读取第一个数字,还读取该参数字符串内的整个整数?
解决方法
要将包含数字的字符串转换为row_number = atoi(argv[i]);
:
row_number
此外,您不应该在签名中获得row_number
。您没有使用它的值,并且您对int row_number = 0;
所做的任何更改都不会影响调用函数。
您应该在函数内部定义它:
db.session.flush()
,
因为函数的第一个可执行语句是将row_number
设置为0,所以不需要 将其作为参数。它会忽略传入的值,并返回最终值。
此外,使用argv
比索引索引更简单。
而且,如果您有以下说法:
23 irow 17
您的函数处理得不好。它将尝试解码23
而不是17
拥有一个“状态”变量并一次只查看一个参数会更简单。
而且,您可以/应该使用atoi
获取所有数字[vs.仅解码数字字符串的第一位数字。]
这是重构版本:
#include <string.h>
#include <stdlib.h>
int
insertRow(char **argv)
{
char *cp;
int match = 0;
int row_number = 0;
for (cp = *argv++; cp != NULL; cp = *argv++) {
// we just saw "irow",so this is the number
if (match) {
row_number = atoi(cp);
break;
}
// if current token is "irow",next token is the number
match = (strcmp(cp,"irow") == 0);
}
return row_number;
}