输入未知长度的字符串

时间:2018-04-14 08:14:28

标签: c arrays if-statement input

我写了这个用'*'替换两个空格的程序。

如何修改代码,使其无论字符串大小如何都能做同样的事情?是否只能使用getchar#include <stdio.h> int c; char buffer[256]; int counter= 0; int i; int main() { while ((c = getchar()) != '\n'&&c!=EOF) { buffer[counter] =c; counter++; if (counter >=255) { break; } } for(i=0; i<256; i++) { if(buffer[i]== ' '&&buffer[i+1]==' ') { buffer[i]= '*'; putchar(buffer[i]); i = i + 2; continue; } putchar(buffer[i]); } putchar('\n'); return 0; }

:checked

2 个答案:

答案 0 :(得分:1)

问题陈述并不要求您将完整输入存储在缓冲区中。关于输出什么字符的决定仅取决于输入的最后两个字符。请考虑以下代码:

#include <stdio.h>

int main(void)
{
  // two variables for the last two input characters
  int c = EOF, last = EOF;
  while ((c = getchar()) != EOF)
    {
      // if both are a space, store a single '*' instead
      if (c == ' ' && last == ' ')
        {
          c = '*';
          last = EOF;
        }
      // print the output, and shift the buffer
      if (last != EOF)
        putchar(last);
      last = c;
    }
  // take care of the last character in the buffer after we see EOF
  if (last != EOF)
    putchar(last);
}

根本不需要malloc和朋友。对于一个需要在编写代码之前仔细考虑的问题,这是一个很好的例子,以免在缓冲区上浪费不必要的资源。

答案 1 :(得分:0)

仅打印代码:

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

int main() 
{
    char prev = EOF, curr;
    while ((curr =(char)getchar()) != '\n' && curr != EOF) 
            {  

                if(curr==' '&&prev==' ')
                {
                    curr = '*';
                    prev = EOF;

                }
                if (prev != EOF)
            putchar(prev);
        prev = curr;
            }
            putchar(prev);
    return 0;
}

使用realloc实际更改字符串:

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

    int main() {
        unsigned int len_max = 128;
        char *m = malloc(len_max);
        char c;             
        int counter= 0;    
        int i;
        int current_size = 256;
                printf("please input a string\n");
                while ((c = getchar()) != '\n' && c != EOF) 
                {  

            m[counter] =(char)c;
            counter++;
            if(counter == current_size)
            {
                        current_size = i+len_max;
                m = realloc(m, current_size);
            }

                }


         for(i=0; i<counter; i++) 
         {

            if(m[i]== ' '&&m[i+1]==' ')
            { 
                m[i]= '*';
                putchar(m[i]); 
                i = i + 2; 
                continue; 
            }
            putchar(m[i]); 
        }

        putchar('\n'); 
        free(m);
        m = NULL;
        return 0;
    }