【问题标题】:Replacing three 'a' in with a single '*' in a string用字符串中的单个 '*' 替换三个 'a'
【发布时间】:2018-09-11 15:07:17
【问题描述】:

所以我的程序应该从用户那里获取输入并将其存储在一个数组中。之后,如果输入字符串连续包含三个“a”,则应将其替换为单个“*”。但是我似乎无法正确处理。它仅将第一个 a 替换为 *。我尝试将以下 2 a 替换为空白,但输出看起来很有趣。 对于这个练习,我必须使用 putchar()getchar()。

提前谢谢你。

#include <stdio.h>

char c;
char buffer[256];
int counter= 0;
int i;

int main()
{
    while ((c = getchar()) != '\n') {

        buffer[counter] =c;
        counter++;

        if (counter >255) {
            break;
        }
    }

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

        if(buffer[i]== 'a'&&buffer[i+1]=='a'&&buffer[i+2]=='a')
        {

            buffer[i]= '*';
            buffer[i+1]=' ';
            buffer[i+2]=' ';

        }
        putchar(buffer[i]);
    }

    putchar('\n');
    return 0;
}

【问题讨论】:

  • buffer[i + 1]buffer[i + 2] 有可能越界访问:这是未定义的行为。
  • for (..,i&lt;256 --> for (...,i&lt;256-2

标签: c arrays if-statement replace while-loop


【解决方案1】:

如果要更改字符数,则需要创建一个不同的缓冲区来将输出复制到。

如果你真的只是想输出到控制台,你可以只写每个字符,直到你找到匹配的字符串。

#include <stdio.h>

char c;
char buffer[256];
char output[256];
int counter= 0;
int i, j;

int main()
{
    while ((c = getchar()) != '\n') {

        buffer[counter] = c;
        counter++;

        if (counter >255) {
            break;
        }
    }
    buffer[counter] = 0;


    for(i=0, j=0; i<256; i++, j++) {
        if(buffer[i] == 'a' && buffer[i+1] == 'a'&& buffer[i+2] == 'a')
        {
                output[j]= '*';
                i += 2;
        }
        else
            output[j] = buffer[i];

        putchar(output[j]);
    }

    putchar('\n');
    return 0;
}

【讨论】:

    【解决方案2】:

    在字符串中,您必须在末尾指定一个字符结尾,即调用空字符\0 或只是一个数字0。更正您的代码,如下所示:-

    while ((c = getchar()) != '\n') {
    
        buffer[counter] =c;
        counter++;
    
        if (counter >=255) {
            break;
        }
    }
     buffer[counter] ='\0';// or buffer[counter] =0;
    

    为避免在字符串数组中产生副作用,请始终先将其所有值设置为 0:-

      char buffer[256];
      memset(buffer, 0, sizeof(buffer));
    

    【讨论】:

      【解决方案3】:

      所以我的程序应该从用户那里获取输入并将其存储在一个数组中。 之后,如果输入字符串连续包含三个 'a',它应该 替换为单个“*”。但是我似乎无法正确处理。

      你几乎明白了!只需将索引通过2 移动到continue

      #include <stdio.h>
      
      char c;
      char buffer[256];
      int counter= 0;
      int i;
      
      int main(void)
      {
          while ((c = getchar()) != '\n') {
      
              buffer[counter] =c;
              counter++;
      
              if (counter >= 255) {
                  break;
              }
          }
          buffer[counter] ='\0';
      
          for(i=0; i<256; i++) {
              if(buffer[i]== 'a'&&buffer[i+1]=='a'&&buffer[i+2]=='a')
              {
                  buffer[i]= '*';
                  putchar(buffer[i]);
                  i = i + 2;
                  continue;
              }
              putchar(buffer[i]);
          }
      
          putchar('\n');
          return 0;
      }
      

      测试:

      123aaa456aaa78                                                                                                                               
      123*456*78
      

      【讨论】:

      • 我对 continue 语句有疑问。它在 if 语句中究竟做了什么?
      • @momonosuke continue 强制程序立即转到for(i=0; i&lt;256; i++) {。它跳过第二个putchar(buffer[i]);
      【解决方案4】:

      您的代码中存在多个问题:

      • 没有理由将所有这些变量设为全局变量。在 main 函数的主体中本地声明它们。
      • int 用于c 的类型,因为getchar() 的返回值不适合char
      • 你没有检查EOF
      • 您的缓冲区溢出测试被取消了。
      • 您不要空终止buffer 中的字符串。您可能将 buffer 设为全局,因此它被初始化为所有位 0,但更好的解决方案是在读取循环之后显式设置空终止符。
      • 要用一个字符替换 3 个字符的序列,您需要复制字符串的其余部分。

      您可以使用一种简单的方法,称为 2 指方法:您在同一个数组中使用 2 个不同的索引变量,一个用于读取,一个用于写入。

      这是它的工作原理:

      #include <stdio.h>
      
      int main() {
          char buffer[256];
          int c;
          size_t i, j, counter;
      
          for (counter = 0; counter < sizeof(buffer) - 1; counter++) {
              if ((c = getchar()) == EOF || c == '\n')
                  break;
              buffer[counter] = c;
          }
          buffer[counter] = '\0';
      
          for (i = j = 0; i < counter; i++, j++) {
              if (buffer[i] == 'a' && buffer[i + 1] == 'a' && buffer[i + 2] == 'a') {
                  buffer[j] = '*';
                  i += 2;
              } else {
                  buffer[j] = buffer[i];
              }
          }
          buffer[j] = '\0';   /* set the null terminator, the string may be shorter */
          printf("modified string: %s\n", buffer);
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-11-01
        • 1970-01-01
        • 2013-01-07
        • 2022-12-11
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多