在if语句中声明指针

时间:2013-06-21 07:48:02

标签: c pointers if-statement

我已声明以下变量

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 个答案:

答案 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 strcmpstrncmp,参数是char *,所以你必须做出例子 if(strcmp(min,“4”)== 0)

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

PS:你的行如table1 [5] = min;因为Table1 [5]是char而min是char *

,所以不起作用

答案 3 :(得分:0)

要进行比较,您必须使用strcmp或strncmp,因为您要比较char *。 你不应该*min,因为minchar*所以当你*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++;
     }