如何定位这些符号并将其从反向字符串中删除



这是一个奇怪的特定问题,但我需要帮助,因为我很困惑。我试图使用指针来要求用户输入一个字符串,输出将打印相反的字符串。到目前为止,我已经使用了反向函数并应用了指针。下面是代码现在的样子:

#include <iostream>
using namespace std;
void reverse(char name[])
{
char *p;
p = name;
while (*p != '')
{
++p;
}
while (*p >= 0)
{
cout << *p;
--p;
}
}
int main()
{
char name[100];
cout << "Please enter a string: ";
cin.getline(name, sizeof(name));
cout << "The reverse of the string is: ";
reverse(name);
return 0;
}

当我运行这个程序时,它是有效的,但有一个问题。例如,输入的字符串是堆栈溢出,这是结果:

Please enter a string: Stack Overflow
The reverse of the string is:  wolfrevO kcatS    ►☺ ◄                   a 

正如您所看到的,这些符号显示在最终输出中。我尝试过定位它的来源,我认为这是因为指针,因为当我为函数使用数组时,它正确地打印了不带符号的反向字符串。我在问,是否有一种方法可以让我在使用指针的同时删除这些符号?我已经尝试过用指针制作函数的多种变体,但符号仍然会在最后打印出来。

发生这种乱码是因为在字符串的开头没有null终止字符,因此在返回时不会终止。我修改了你的代码,使sentinel零字符保持在第0个位置,现在你的代码工作起来没有错误。

条件while (*p >= 0)也应替换为while (*p)

在线试用!

#include <iostream>
using namespace std;
void reverse(char name[])
{
char *p;
p = name;
while (*p != '')
{
++p;
}
--p;
while (*p)
{
cout << *p;
--p;
}
}
int main()
{
char name[100];
name[0] = 0;
cout << "Please enter a string: ";
cin.getline(name + 1, sizeof(name) - 1);
cout << "The reverse of the string is: ";
reverse(name + 1);
return 0;
}

输入:

Please enter a string: Stack Overflow

输出:

The reverse of the string is: wolfrevO kcatS

使用时

while (*p >= 0)
{
cout << *p;
--p;
}

你似乎认为数组开始之前的空间被一些负的东西占据了;这不是一个安全的假设,循环可以迭代超过这一点,打印内存区域中的任何二进制垃圾。我说它可以,因为像那样将指针取消引用到未分配的空间是未定义的行为它可以做任何事情;它可以终止循环,使程序看起来正常工作,它可以打印胡言乱语,它可以使计算机崩溃。

如果您想停在给定字符串的开头,请查找给定字符串的开始:

do
{
--p;
cout << *p;
}
while (p != name);

您正在向字符串中读取100个字符,这意味着也有可能读取一些垃圾输入缓冲区值。这就是符号的来源。由于您使用的是char数组,因此可能不使用getline,而是使用以下内容:

char c = getchar();
int i = 0;
while(c != 'n'){
name[i] = c;
c= getchar();
i++;
}
name[i++] = ''

通过这种方式,您将只读取需要读取的内容,并在字符串末尾使用终止字符"\0"。请记住,使用getline tho可能有一个更清洁的解决方案。不管怎样,问题是你读取的值比你想读取到char数组中的值多,而且由于你是直接访问内存的,你需要想办法在所需的字符串后面添加一个"\0",所以这个方法知道什么时候停止-我猜char数组的实现方式是为了确保这种情况总是发生,因此,它适用于char数组,但不适用于指针。

最新更新