【问题标题】:C - No output printing after changing strtok to incorporate strcmpC - 更改 strtok 以合并 strcmp 后无输出打印
【发布时间】:2016-11-16 05:41:10
【问题描述】:

我的目的是创建一个循环,比较标记 phrases。如果短语是唯一的(与任何其他短语不同),则打印它,如果短语不是唯一的,则 tally 增加 1 并且不打印重复的短语。所以每个短语只打印一次,稍后我将添加代码来显示每个短语被计算了多少次。

程序编译没有错误,运行时没有输出,程序结束并退出。函数filter_spacesupper_case 工作正常,在我将for (token = strtok(string, strip); token; token = strtok(NULL, strip)) 更改为for 循环之前它确实打印了短语。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    void filter_spaces(char* string);
    void upper_case(char string[]);

    int main(){

        char c, string[201];
        int i = 0, k=0, j=0;
        char strip[] = ",.:;?!";
        char* phrases[1000];
        int tally = 0;


        printf("What gibberish shall I parse?\n");

        while((c = getchar()) != EOF)  //while loop for getting characters from stdin

            string[i++] = c;
            string[i] = '\0';  //insert NULL at end of string
            filter_spaces(string);
            upper_case(string);
            char *phrase = strtok(string, strip);

            puts("\nThe phrases entered are: ");

            /*for (token = strtok(string, strip); token; token = strtok(NULL, strip))
              {
                puts(token);
              }
             */

            while(phrase != '\0')
            {
                phrases[i++] = strdup(phrase);
                phrase = strtok(NULL, strip);

            for(k=0; k<i-1; k++)
             {
                for(j = k+1; j<k; j++)
                {
                    if(strcmp(phrases[k], phrases[j])==0)
                    {
                        tally = tally++;  //add to phrases[k] count
                    }
                    else
                    {
                        printf("<%s>\n", phrase); //print and continue on
                    }                       
                 }
              }
           } 

    return 0;
    }
    void upper_case(char string[])
    {
      int c = 0;

      while (string[c] != '\0')
      {
        if (string[c] >= 'a' && string[c] <= 'z')
        {
          string[c] = string[c] - 32;
         }
         c++;
      }
    }

    void filter_spaces(char* string)
    {
      int i,x;
      for(i=x=1; string[i]; ++i)
        if(string[i]!=' ' || string[i+1]!=' ')
          string[x++] = string[i];
      string[x] = '\0';
    }

【问题讨论】:

    标签: c loops pointers strtok strcmp


    【解决方案1】:

    希望对您有所帮助。您计算重复和打印唯一字符的逻辑是错误的。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void filter_spaces(char* string);
    void upper_case(char string[]);
    
    int main()
    {
        char c, string[201];
        int i = 0, k = 0, j = 0;
        char strip[] = " ,.:;?!";
        char* phrases[1000];
        int tally = 0;
    
        printf("What gibberish shall I parse?\n");
    
        while((c = getchar()) != '\n')  //while loop for getting characters from stdin
            string[i++] = c;
    
        string[i] = '\0';  //insert NULL at end of string
        filter_spaces(string);
        upper_case(string);
        char *phrase = strtok(string, strip);
    
        puts("\nThe phrases entered are: ");
    
        /*
        for (token = strtok(string, strip); token; token = strtok(NULL, strip))
        {
            puts(token);
        }
        */
    
        i=0;    
        while(phrase != '\0')
        {
            phrases[i] = strdup(phrase);
    
            int flag=0;
            for(k=0; k<i; k++)
            {
               if(strcmp(phrases[k], phrase)==0)
               {
                    tally = tally++;  //add to phrases[k] count
                    flag=1;
                    break;
               }
            }
            if(flag==0)
            {       
               printf("**** %s \n", phrase); //print and continue on
            }
            phrase = strtok(NULL, strip);
            ++i;
        }
        printf("Total Number of repeated Words = %d\n",tally);
    
        return 0;
    }
    
    void upper_case(char string[])
    {
        int c = 0;
    
        while (string[c] != '\0')
        {
            if (string[c] >= 'a' && string[c] <= 'z')
            {
                string[c] = string[c] - 32;
            }
            c++;
        }
    }
    
    void filter_spaces(char* string)
    {
        int i,x;
        for(i=x=1; string[i]; ++i)
            if(string[i]!=' ' || string[i+1]!=' ')
                string[x++] = string[i];
        string[x] = '\0';
    }
    

    【讨论】:

      【解决方案2】:

      您的程序无法运行,因为您没有正确关闭 while 循环。 试试这个:

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
      void filter_spaces(char* string);
      void upper_case(char string[]);
      
      int main()
      {
          char c, string[201];
          int i = 0, k = 0, j = 0;
          char strip[] = ",.:;?!";
          char* phrases[1000];
          int tally = 0;
      
          printf("What gibberish shall I parse?\n");
      
          while((c = getchar()) != EOF)  //while loop for getting characters from stdin
              string[i++] = c;
      
          string[i] = '\0';  //insert NULL at end of string
          filter_spaces(string);
          upper_case(string);
          char *phrase = strtok(string, strip);
      
          puts("\nThe phrases entered are: ");
      
          /*
          for (token = strtok(string, strip); token; token = strtok(NULL, strip))
          {
              puts(token);
          }
          */
      
          while(phrase != '\0')
          {
              phrases[i++] = strdup(phrase);
              phrase = strtok(NULL, strip);
          }
      
          for(k=0; k<i-1; k++)
          {
              for(j = k+1; j<k; j++)
              {
                  if(strcmp(phrases[k], phrases[j])==0)
                  {
                      tally = tally++;  //add to phrases[k] count
                  }
                  else
                  {
                      printf("<%s>\n", phrase); //print and continue on
                  }                       
              }
          }
      
          return 0;
      }
      
      void upper_case(char string[])
      {
          int c = 0;
      
          while (string[c] != '\0')
          {
              if (string[c] >= 'a' && string[c] <= 'z')
              {
                  string[c] = string[c] - 32;
              }
              c++;
          }
      }
      
      void filter_spaces(char* string)
      {
          int i,x;
          for(i=x=1; string[i]; ++i)
              if(string[i]!=' ' || string[i+1]!=' ')
                  string[x++] = string[i];
          string[x] = '\0';
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-28
        • 2014-11-04
        • 1970-01-01
        相关资源
        最近更新 更多