所以基本上在这个练习中,我应该反转给定字符串中的每个单词。单词被认为包含字母数字字符,任何非字母数字字符将结束单词。例如"这是一个示例字符串,无论如何。"并反过来" 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;创建的。我不知道错误来自哪里,我希望有人可以帮助我解决这个问题。提前谢谢。
答案 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'
循环将继续读取,直到找到恰好是字母数字的字节,这可能是未初始化的内存。
您的while
或strrev
功能也可能出现问题,但您没有发布。
如果你将这个函数传递给一个长度超过99个字符的'word'字符串,那么考虑会发生什么也是个好主意。
答案 2 :(得分:0)
&#34;使用未初始化的大小为8&#34;可能来自于你没有立即初始化char指针(temp和zet)这一事实,在64位系统上它确实有8(字节)的大小。 如果你没有一个值来指示一个指针,你应该总是确保用0初始化它,这样你就知道它并没有指向任何东西。