C中字符串中的反转字

时间:2014-04-23 15:59:07

标签: c string pointers

所以基本上在这个练习中,我应该反转给定字符串中的每个单词。单词被认为包含字母数字字符,任何非字母数字字符将结束单词。例如"这是一个示例字符串,无论如何。"并反过来" sihT si na elpmaxe gnirts,revetahw。"。

我真的很难弄清楚我的书面代码有什么问题。代码似乎正在工作,但是当我将它发送到测试服务器时,它会给我一个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++;
    }
}

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

3 个答案:

答案 0 :(得分:2)

这是对函数的更改,该函数进行最小的更改以修复原始代码中的错误。特别做了两个更改:1)用while的底部的str(从早期的帖子修改)的简单赋值替换了最后一个while循环。已经计算了正确的答案,并且这个赋值将字符串向前移动,而没有另一个while循环,它有一个问题就是从最后掉下来。 2)在temp++附近放置一个“其他”,因为在找到某个单词时不应该这样做,或者你可以结束。

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;
    }
}

答案 1 :(得分:1)

这可能是一个问题:

         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指向输入字符串末尾的非字母垃圾,或者{{1}字符串末尾的终结符。在任何一种情况下,终结符都不是字母数字,因此第二个'\0'循环将继续读取,直到找到恰好是字母数字的字节,这可能是未初始化的内存。

您的whilestrrev功能也可能出现问题,但您没有发布。

如果你将这个函数传递给一个长度超过99个字符的'word'字符串,那么考虑会发生什么也是个好主意。

答案 2 :(得分:0)

&#34;使用未初始化的大小为8&#34;可能来自于你没有立即初始化char指针(temp和zet)这一事实,在64位系统上它确实有8(字节)的大小。 如果你没有一个值来指示一个指针,你应该总是确保用0初始化它,这样你就知道它并没有指向任何东西。