0

我已经声明了以下变量

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  
4

4 回答 4

0

您的代码中几乎没有问题。

第一个。至少可以说,您正在以非常危险的方式比较字符串。它可以在一些奇怪的情况下工作。一般来说,它应该被认为是错误的。在您应该使用类似或类似c的适当功能。strcmp

第二。除了格式字符串(或)中的预期类型外,您fprintf(...)的 s 看起来完全相同。但是,类型不改变!使用错误的说明符可能会导致观察到奇怪的输出,导致一些难以发现的内存错误。在我看来,您应该始终使用. 因为它的所有类型。另外为了简化打印我猜你可以使用一个简单的循环。%s%dtable1%schar*for

第三。你if的 's 可以切换到更合适case的或至少if else,因为你永远不会在那里一次执行两个分支。但它不太重要,因为它不会改变整体逻辑。在某些情况下,它可能对性能至关重要。

编辑:

好的,您if可以用两种方式编写。

char *table[10] = {0};这将创建一个指向 10 个字符串的指针表。您仍然需要进一步保留空间以实际容纳字符。此外,table1[5]=min;不会将字符串放入/复制mintable1. ==和 and是一样的错误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

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]);

这不会重现您的所有代码,但应该让您达到一个简单的下坡路。

编辑2:

我以为您想避免使用min,max等,然后将其切换到表格。我的错。您当然可以使用 table 并重新使用这些指针,以避免我之前建议的不必要的复制字符串。但是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编译器是否允许它。

于 2013-06-21T07:58:28.367 回答
0

由于 C 中的字符串实际上是一个字符数组,并且由于 C 中的所有数组变量都是指针,因此当您对样式进行比较时,*min == "4"您实际上是将第一个位置中包含的min内容与常量字符串所在的任何位置进行"4"比较给定的。

为了执行字符串比较,您必须使用函数strcmp,它就是为此目的。

如果您想要一种更简洁的打印输出方式,则可以将结果字符串保存在char **数组中,然后使用for循环打印它们。

于 2013-06-21T07:56:59.460 回答
0

要进行比较,您必须使用 strcmp 或 strncmp,因为您正在比较 char*。您不应该这样做*min,因为minchar*您这样做时,*min == "4"您会尝试比较 min 的第一个字符的 ascii 值(*min == min[0])。当您尝试与一位数字进行比较时,这很好,但如果您尝试将一个数字与多位数字进行比较,它将无法正常工作。

然后以一种很好的方式显示不要使用 %d 来显示 0 因为你试图显示 NULL 但你可以做类似的事情

for (int i = 0; i < 10; i++)
{
 if (table1[i] == NULL)
   fprintf(ft, "0 ");
else
   fprintf(ft, "%s ", table1[i]);
}
fprintf(ft, "\n");

当您填写标签时,也许您可​​以尝试类似(在 strtok 的循环中)

 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++;
     }

在这种情况下,您可以直接与数字进行比较并直接执行

if (tab1[i] == 4)
 ...
于 2013-06-21T10:04:51.663 回答
0

使用strcmpstrncmp,参数是 char* 所以你必须例如 if (strcmp(min,"4") ==0)

请注意,您必须包含 string.h (我认为您已经这样做以使用 strcat )

PS:您的行如 table1[5]=min; 不起作用,因为 Table1[5] 是 char 而 min 是 char*

于 2013-06-21T09:53:08.273 回答