我已声明以下变量
char min[6] = "";
char max[6] = "";
char hr[6] = "";
char div[6] = "";
char vol[6] = "";
并使用以下代码我获得了一些带有strtok的令牌
if (pos)
{
ptr = strtok(buff, "Nodo_,=:V()");
i = 0;
while (ptr != NULL)
{
if (i == 0)
strcat(min, ptr);
if (i == 2)
strcat(tmax, ptr);
if (i == 4)
strcat(hr, ptr);
if (i == 6)
strcat(div, ptr);
if (i == 8)
strcat(vol, ptr);
ptr = strtok(NULL, "Nodo_,=:V()");
i++;
}
printf("Results: %s, %s, %s, %s, %s\n", min, max, hr, div, vol);
,结果类似于
Results: 4, 23, 45, 67, 89
我想创建一个if语句,它将执行以下操作(其中s是本地时间)
char *table1[10] = {0};
if(*min == "4")
{
table1[5]=min;
table1[6]=max;
table1[7]=hr;
table1[8]=div;
table1[9]=vol;
fprintf(ft,"%s %d %d %d %d %s %s %s %s %s",s,table1[0],table1[1],table1[2],table1[3],table1[5],table1[6],table1[7],table1[8],table1[9]);
}
else
{
table1[0]=min;
table1[1]=max;
table1[2]=hr;
table1[3]=div;
table1[4]=vol;
fprintf(ft,"%s %s %s %s %s %d %d %d %d %d",s,table1[0],table1[1],table1[2],table1[3],table1[5],table1[6],table1[7],table1[8],table1[9]);
}
问题是我不知道如何编写if语句来与值4进行比较。我使用了不同的方法,但我总是只在ELSE中得到结果
if(*min == "4")
if(*min == '4')
if(&min == "4")
etc.
其次,你可以请我给我写一个更好的方法来写这个可怕的fprintf吗?因为我想要这样的结果:
0 0 0 0 4 23 45 67 89
或
5 23 45 67 89 0 0 0 0
答案 0 :(得分:0)
由于C中的字符串实际上是一个字符数组,并且由于C中的所有数组变量都是指针,因此当您对样式*min == "4"
进行比较时,实际上是在比较第一个位置中包含的内容min
的任何位置,给定常量字符串"4"
。
为了执行字符串比较,您必须使用函数strcmp,这是为了这个目的。
如果您想要一种更清晰的打印方式,那么您可以将结果字符串保存在char **
数组中,然后使用for
循环打印它们。
答案 1 :(得分:0)
您的代码中存在一些问题。
第一。你要以非常危险的方式比较字符串,至少可以这么说。它可以在一些奇怪的情况下工作。通常它应该被认为是错误的。
在c
中,您应该使用strcmp
或类似的适当函数。
第二。除了格式字符串(fprintf(...)
或%s
)中的预期类型外,您的%d
外观完全相同。但是,table1
的类型并没有变化!使用错误的说明符可能导致从观察到的奇怪输出,到一些难以找到的内存错误。对我来说,你应该总是使用%s
。因为它的所有char*
类型。
另外,为了简化打印,我猜你可以使用一个简单的for
循环。
第三。您的if
可以切换到更合适的case
或至少if else
,因为您永远不会在那里执行两个分支。但它不那么重要,因为它不会影响整体逻辑。在某些情况下,它可能是性能至关重要的。
编辑:
好的,您的if
可以用两种方式书写。
char *table[10] = {0};
这会创建一个指向10个字符串的指针表。您仍需要进一步保留空间以实际保存字符。此外,table1[5]=min;
不会将字符串min
放入/复制到table1
的第5个插槽中。这与使用==
和strcmp
的错误相同。您应该阅读有关在c
中使用字符串的简短介绍/教程。
您需要更多类似的内容:
char *table[10] = {0}; //create a table with pointers to 10 "strings"
size_t MAX_STR_SIZE = 6; // I assumed this from your example code.
for(int i = 0; i < 10; ++i){
table[i] = malloc(MAX_STR_SIZE); //allocate space for string
//initialize
table[i][0] = '0'; //put '0' into as 1st char
table[i][1] = '\0'; //put null character at 2nd space
//table[i][0] = '\0'; // You can use this line or the one below this to initialize it
//table[i][0] = 0; // to a nullstring like you did in your 1st code snippet
}
然后你可以转到你的
if(strcmp(min,"4") == 0)
{
strcpy(table[5], min); //This is how you copy null terminated strings in `c`.
strcpy(table[6], max);
strcpy(table[7], hr);
//...
} else {...}
fprintf(ft,"%s ", s);
for(int i = 0; i < 10; ++ 1) fprintf(ft,"%s ", table[i]);
这不会重现您的所有代码,但应该让您达到一个简单的下坡路。
EDIT2:
我以为你想避免使用min,max
等,只是将其切换到表格。我的错。您当然可以使用表并重新使用这些指针,以避免不必要的复制字符串,如我之前建议的那样。但是table[i]
必须始终包含正确的字符串。即不是空指针,而不是指向某些随机内存垃圾的指针。我会建议像:
char default_str[1] = ""; // or default_str[2] = "0" depending on your needs.
char *table[10] = {0}; //create a table with pointers to 10 "strings"
//...
if(*min == "4")
{
table[0]=table[1]=table[2]=table[3]=table[4]=default_str;
table[5]=min;
table[6]=max;
table[7]=hr;
table[8]=div;
table[9]=vol;
}
else
{
table[5]=table[6]=table[7]=table[8]=table[9]=default_str;
table[0]=min;
table[1]=max;
table[2]=hr;
table[3]=div;
table[4]=vol;
}
fprintf(ft,"%s ", s);
for(int i = 0; i < 10; ++ 1) fprintf(ft,"%s ", table[i]);
这样,您可以设置未使用的指针以引用default_str
。现在它更接近原始代码,使用更少的内存,因为table
条目与原始变量“共享”内存。
您可能也可以使用char *table[10] = {default_str}
,然后跳过在if
分支内重新初始化它,但我不确定c
编译器是否会允许它。
答案 2 :(得分:0)
USE strcmp或strncmp,参数是char *,所以你必须做出例子 if(strcmp(min,“4”)== 0)
请注意,您必须包含string.h(我认为您已经这样做以使用strcat)
PS:你的行如table1 [5] = min;因为Table1 [5]是char而min是char *
,所以不起作用答案 3 :(得分:0)
要进行比较,您必须使用strcmp或strncmp,因为您要比较char *。
你不应该*min
,因为min
是char*
所以当你*min == "4"
时,你正在尝试比较min {{的第一个字符的ascii值。 1}}。
当您尝试与一位数进行比较时,它很好,但如果您尝试将数字与多位数进行比较则无法正常工作。
然后以很好的方式显示,因为您尝试显示NULL,所以不要使用%d来显示0 但你可以做点什么
(*min == min[0])
当你填写标签时,你可以尝试类似的东西(在strtok的循环中)
for (int i = 0; i < 10; i++)
{
if (table1[i] == NULL)
fprintf(ft, "0 ");
else
fprintf(ft, "%s ", table1[i]);
}
fprintf(ft, "\n");
但是,如果您只是在操纵数字,则可以使用简单的 while (ptr != NULL)
{
if (i%2 == 0)
tab1[i / 2] = strdup(ptr); //don't forget to free at the end ;)
i++;
}
(int*
)并将其填入int tab1[10]
atoi
在这种情况下,您可以直接与数字进行比较并直接进行
while (ptr != NULL)
{
if (i%2 == 0)
tab1[i / 2] = atoi(ptr); //
i++;
}