如何使用在txt文件中输入的字符串作为if条件
How to use a string entered in a txt file as an if condition
包含矢量函数的函数包含在名为 Vector 的 class 中。我会通过txt文件中输入的字符串来确定main函数中使用哪个函数
class Vector
{
public: // private?
double x, y, z;
public:
Vector() {
x = 0;
y = 0;
z = 0;
}
Vector(int _x, int _y, int _z) {
x = _x;
y = _y;
z = _z;
}
Vector Add(Vector v) {
Vector output;
output.x = x + v.x;
output.y = y + v.y;
output.z = z + v.z;
return output;
}
double Dot(Vector v) {
double output;
output = (x * v.x) + (y * v.y) + (x * v.y);
return output;
}
};
这是主要功能。我想在 txt 文件中使用我想接收的字符串,但效果不佳。详细示例在这段代码下方。
int main()
{
FILE* fpInput;
FILE* fpOutput;
int vectorAx, vectorAy, vectorAz, vectorAdim;
int vectorBx, vectorBy, vectorBz, vectorBdim;
char VecFun[10];
fpInput = fopen("input.txt", "r");
fscanf(fpInput, "%d %d %d", &vectorAx, &vectorAy, &vectorAz);
fscanf(fpInput, "%d %d %d", &vectorBx, &vectorBy, &vectorBz);
fclose(fpInput);
fpInput = fopen("input.txt", "r");
fgets(VecFun, sizeof(VecFun), fpInput);
fclose(fpInput);
Vector vectorA(vectorAx, vectorAy, vectorAz);
Vector vectorB(vectorBx, vectorBy, vectorBz);
if (VecFun == "Add") {
Vector vectorO = vectorA.Add(vectorB);
fpOutput = fopen("output.txt", "w");
fprintf(fpOutput, "%.f %.f %.f", vectorO.x, vectorO.y, vectorO.z);
fclose(fpOutput);
}
else if (VecFun == "Dot") {
fpOutput = fopen("output.txt", "w");
fprintf(fpOutput, "%.f", vectorA.DotProduct(vectorB));
fclose(fpOutput);
}
else {
printf("Invalid input.. (%s)\n", VecFun);
}
return 0;
}
input.txt:
Add
1 2 3
4 5 6
ouput.txt:
5 7 9
input.txt:
Dot
1 2 3
4 5 6
ouput.txt:
32
但是,if 条件不起作用,所以我尝试调试:
printf("Invalid input.. (%s)\n", VecFun);
并找到了这个结果:
为什么会出现这些结果?另外,如何修改 if 条件使其生效?
You can't compare C-style strings for equality using the ==
operator。在像 if (VecFun == "Add")
这样的代码中,VecFun
变量(char
数组的名称)和 "Add"
(字符串文字)都衰减为指向其第一个元素的指针;并且,由于它们是 不同 项,位于 不同 内存位置,该测试将始终产生 false
值。
在 C 中,您需要使用 strcmp
函数,如上面链接问题的答案所示。但是,在 C++(自 C++14 起)中,您可以使用 s
suffix; 将文字指定为 std::string
对象;然后,像 VecFun == "Add"s
这样的测试将按预期工作。1
这是一个简短的演示:
#include <iostream>
#include <string>
using namespace std::string_literals;
int main()
{
char test[10] = "Add";
// Wrong - comparing two different pointers ...
if (test == "Add") {
std::cout << "Raw comparison succeeded!\n";
}
else {
std::cout << "Raw comparison failed!\n";
}
// Plain "C" way, using the strcmp function ...
if (strcmp(test, "Add") == 0) {
std::cout << "strcmp comparison succeeded!\n";
}
else {
std::cout << "strcmp comparison failed!\n";
}
// C++ way, using std::string literals ...
if (test == "Add"s) {
std::cout << "std::string comparison succeeded!\n";
}
else {
std::cout << "std::string comparison failed!\n";
}
return 0;
}
1 如果您的编译器不支持 C++14 标准或字符串文字运算符,您可以构造一个 std::string
对象 explicily 来自文字,使用 std::string("Add")
等表达式代替 "Add"s
.
包含矢量函数的函数包含在名为 Vector 的 class 中。我会通过txt文件中输入的字符串来确定main函数中使用哪个函数
class Vector
{
public: // private?
double x, y, z;
public:
Vector() {
x = 0;
y = 0;
z = 0;
}
Vector(int _x, int _y, int _z) {
x = _x;
y = _y;
z = _z;
}
Vector Add(Vector v) {
Vector output;
output.x = x + v.x;
output.y = y + v.y;
output.z = z + v.z;
return output;
}
double Dot(Vector v) {
double output;
output = (x * v.x) + (y * v.y) + (x * v.y);
return output;
}
};
这是主要功能。我想在 txt 文件中使用我想接收的字符串,但效果不佳。详细示例在这段代码下方。
int main()
{
FILE* fpInput;
FILE* fpOutput;
int vectorAx, vectorAy, vectorAz, vectorAdim;
int vectorBx, vectorBy, vectorBz, vectorBdim;
char VecFun[10];
fpInput = fopen("input.txt", "r");
fscanf(fpInput, "%d %d %d", &vectorAx, &vectorAy, &vectorAz);
fscanf(fpInput, "%d %d %d", &vectorBx, &vectorBy, &vectorBz);
fclose(fpInput);
fpInput = fopen("input.txt", "r");
fgets(VecFun, sizeof(VecFun), fpInput);
fclose(fpInput);
Vector vectorA(vectorAx, vectorAy, vectorAz);
Vector vectorB(vectorBx, vectorBy, vectorBz);
if (VecFun == "Add") {
Vector vectorO = vectorA.Add(vectorB);
fpOutput = fopen("output.txt", "w");
fprintf(fpOutput, "%.f %.f %.f", vectorO.x, vectorO.y, vectorO.z);
fclose(fpOutput);
}
else if (VecFun == "Dot") {
fpOutput = fopen("output.txt", "w");
fprintf(fpOutput, "%.f", vectorA.DotProduct(vectorB));
fclose(fpOutput);
}
else {
printf("Invalid input.. (%s)\n", VecFun);
}
return 0;
}
input.txt:
Add
1 2 3
4 5 6
ouput.txt:
5 7 9
input.txt:
Dot
1 2 3
4 5 6
ouput.txt:
32
但是,if 条件不起作用,所以我尝试调试:
printf("Invalid input.. (%s)\n", VecFun);
并找到了这个结果:
为什么会出现这些结果?另外,如何修改 if 条件使其生效?
You can't compare C-style strings for equality using the ==
operator。在像 if (VecFun == "Add")
这样的代码中,VecFun
变量(char
数组的名称)和 "Add"
(字符串文字)都衰减为指向其第一个元素的指针;并且,由于它们是 不同 项,位于 不同 内存位置,该测试将始终产生 false
值。
在 C 中,您需要使用 strcmp
函数,如上面链接问题的答案所示。但是,在 C++(自 C++14 起)中,您可以使用 s
suffix; 将文字指定为 std::string
对象;然后,像 VecFun == "Add"s
这样的测试将按预期工作。1
这是一个简短的演示:
#include <iostream>
#include <string>
using namespace std::string_literals;
int main()
{
char test[10] = "Add";
// Wrong - comparing two different pointers ...
if (test == "Add") {
std::cout << "Raw comparison succeeded!\n";
}
else {
std::cout << "Raw comparison failed!\n";
}
// Plain "C" way, using the strcmp function ...
if (strcmp(test, "Add") == 0) {
std::cout << "strcmp comparison succeeded!\n";
}
else {
std::cout << "strcmp comparison failed!\n";
}
// C++ way, using std::string literals ...
if (test == "Add"s) {
std::cout << "std::string comparison succeeded!\n";
}
else {
std::cout << "std::string comparison failed!\n";
}
return 0;
}
1 如果您的编译器不支持 C++14 标准或字符串文字运算符,您可以构造一个 std::string
对象 explicily 来自文字,使用 std::string("Add")
等表达式代替 "Add"s
.