[英]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
循环将继续读取,直到找到恰好是字母数字的字节为止,该字节可能在未初始化的内存中。
您的strrev
或main
功能中也可能有问题,但没有发布它们。
考虑如果将“单词”长于99个字符的字符串传递给该函数,将会发生什么,这也是一个好主意。
“使用大小为8的未初始化值”的原因可能是您没有立即初始化char指针(temp和zet),而在64位系统上,char指针的大小实际上为8(字节)。 如果没有用于初始化指针的值,则应始终确保将其初始化为0,以使您知道它不指向任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.