【问题标题】:How can I fix a string that creates some random characters?如何修复创建一些随机字符的字符串?
【发布时间】:2021-09-09 20:45:39
【问题描述】:

问题是当我尝试反转一个单词时,有些单词会打印出未指定的随机字符。我试图改变字符串大小,结果改变了(有些单词是随机字符,有些不是)

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

#define LEN 20

void reverse( char w[LEN]);

int main() {
char word[LEN];

reverse(word);

return 0;
}

void reverse (char w[LEN]){

char rev[LEN];
int i,j;
fgets(w, LEN, stdin);

for (i = 0, j = strlen(w)-1; i < strlen(w); i++, j--){
    rev[j] = w[i]; 
}

printf("%s\n", rev);

return;

}

我的问题的一个例子是这样的:

输入:bathroom

输出:moorhtabp⬧⬧oz⬧

每次我执行程序时,相同的输入输出都会改变。

【问题讨论】:

  • fgets() 将在字符串末尾添加\n
  • @reshi 您忘记在数组 rev 后面附加零终止字符 '\0'。

标签: c reverse c-strings fgets


【解决方案1】:

您只需在rev 末尾添加'\0'0 即可终止它。

for (i = 0, j = strlen(w)-1; i < strlen(w); i++, j--)
{
    rev[j] = w[i]; 
}
rev[i] = 0;

【讨论】:

    【解决方案2】:

    有几个错误:

    1. fgets() 在字符串末尾添加换行符\n
    2. 您必须在最后一个字符后添加一个字符串终止符(0 字节)。
    3. (较小的问题)在循环条件中使用strlen() 将多次迭代字符串。它通常会导致 O(N^2) 算法。

    修复:

    1. 变体 A

    使用scanf 解析单个单词 scanf(" %19s", w) 说明符 %19s 最多扫描 19 个字符并添加 NULL 终止符以修复 20 字符长的数组

    1. 变体 B

    检查w 的最后一个字符是否为\n。如果是,请将其替换为零。

    int L = strlen(w);
    if (L > 0 && w[L - 1] == '\n') {
      w[--L] = 0;
    }
    
    1. 随便放
    rev[i] = 0;
    

    在最后。

    1. 只需迭代直到 j 为负数,这意味着它到达了“第一个之前的一个”字符,没有什么可做的了。
    for (i = 0, j = L-1; j >= 0; i++, j--)
        rev[j] = w[i]; 
    

    【讨论】:

      【解决方案3】:

      首先是函数的调用

      char word[LEN];
      
      reverse(word);
      

      没有任何意义,因为两个字符串都没有传递给函数。你传递了一个未初始化的字符数组。

      该函数应该只做一件事:反转传递的字符串。 所以fgets的调用应该从函数中去掉,放在main中。

      函数fgets 可以将换行符'\n' 附加到输入的字符串中。您需要将其删除。

      在函数reverse 中,您忘记将终止零字符'\0' 附加到反转的字符串。所以这个电话

      printf("%s\n", rev);
      

      调用未定义的行为。

      标准C函数strlen的返回值类型也是无符号整数类型size_t。你应该使用这个类型而不是有符号整数类型int

      还有这个函数的声明

      void reverse( char w[LEN])
      

      也没有多大意义,因为编译器会将其调整为以下声明

      void reverse( char *w)
      

      通常用户可以将任意长度的字符串传递给函数,该字符串可以大于值LEN

      下面是一个演示程序,展示了如何编写函数。

      #include <stdio.h>
      #include <string.h>
      
      char * reverse( char *s )
      {
          for ( size_t i = 0, n = strlen( s ); i < n / 2; i++ )
          {
              char c = s[i];
              s[i] = s[n - i - 1];
              s[n - i - 1] = c;
          }
          
          return s;
      }
      
      int main(void) 
      {
          enum { N = 20 };
          char s[N];
          
          fgets( s, N, stdin );
          
          s[ strcspn( s, "\n" ) ] = '\0';
          
          puts( s );
          puts( reverse( s ) );
          
          return 0;
      }
      

      如果输入字符串"Hello World!"那么程序输出将是

      Hello World!
      !dlroW olleH
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-20
        • 1970-01-01
        • 2012-07-20
        • 2017-10-10
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多