繁体   English   中英

C语言中的字符串中的反向单词

[英]Reverse Words in a String in C

因此,基本上,在本练习中,我应该反转给定字符串中的每个单词。 单词被认为包含字母数字字符,任何非字母数字字符都将以单词结尾。 例如“无论如何,这都是示例字符串”。 反过来说,“就是这样”。

我真的很难弄清楚我编写的代码出了什么问题。 该代码似乎可以正常工作,但是当我将其发送到测试服务器时,它给出了Valgrind错误。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
void reversed_words(char *str)
{
      char word[100];
      char *temp;
      char *zet;
      temp=str;
      int k=0;
      while(*temp)  //processing complete string
      {
          if(isalnum(*temp))
          {
             while(isalnum(*temp))      //extracting word from string
             {
                word[k]=*temp;
                k++;
                temp++;
             }
             word[k]='\0';
             k=0;
             strrev(word);   // Reverses the string
             zet=word;       
             while (*zet)   // Copying the reversed word into original string
             {
                *str = *zet;
                zet++;
                str++;
             }
             while (!isalnum(*str)) // Skipping all non-alphanumeric character(s)
             {
                str++;
             }
          }
          temp++;
    }
}

因此,我收到以下错误消息:“使用大小为8的未初始化值”和“未初始化值是由堆栈分配创建的”。 我不知道错误来自哪里,我希望有人可以帮助我解决这个问题。 提前致谢。

这是对函数的更改,它进行了最少的更改以修复原始代码中的错误。 具体进行了两项更改:1)在while的底部用一个简单的str替换了最后一个while循环(从先前的文章进行了修改)。 正确的答案已经被计算出来,并且该分配使字符串向前移动,而没有另一个while循环,该循环可能会导致结尾下降。 2)在temp++周围放置一个else,因为当发现一个单词时不应该这样做,否则您可以结束。

void reversed_words(char *str)
{
      char word[100];
      char *temp;
      char *zet;
      temp=str;
      int k=0;
      while(*temp)  //processing complete string
      {
          if(isalnum(*temp))
          {
             while(isalnum(*temp))      //extracting word from string
             {
                word[k]=*temp;
                k++;
                temp++;
             }
             word[k]='\0';
             k=0;
             strrev(word);   // Reverses the string
             zet=word;       
             while (*zet)   // Copying the reversed word into original string
             {
                *str = *zet;
                zet++;
                str++;
             }
          }
          else
          {
             temp++;
          }
          str = temp;
    }
}

这可能是一个问题:

         zet = word;
         while (*zet)   // Copying the reversed word into original string
         {
            *str = *zet;
            zet++;
            str++;
         }
         while (!isalnum(*str)) // Skipping all non-alphanumeric character(s)
         {
            str++;
         }

当处理最后一个单词时,它从第一个while循环中出来,其中str指向输入字符串末尾的非字母垃圾或字符串末尾的'\\0'终止符。 无论哪种情况,终止符都不是字母数字,因此第二个while循环将继续读取,直到找到恰好是字母数字的字节为止,该字节可能在未初始化的内存中。

您的strrevmain功能中也可能有问题,但没有发布它们。

考虑如果将“单词”长于99个字符的字符串传递给该函数,将会发生什么,这也是一个好主意。

“使用大小为8的未初始化值”的原因可能是您没有立即初始化char指针(temp和zet),而在64位系统上,char指针的大小实际上为8(字节)。 如果没有用于初始化指针的值,则应始终确保将其初始化为0,以使您知道它不指向任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM