此代码使我违反访问错误
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string a;
cin >> a;
printf("%s",a.at(1));
return 0;
}
我写这一行,因为此功能给了我一个较大程序的问题,我想弄清楚问题的确是什么...谢谢!
直接问题是"%s"
需要指向C型字符串作为相应参数的指针。a.at(1)
是一个字符,而不是指针,因此当误解为指针时,您的行为不确定。您要"%c"
打印一个字符。
更一般的问题是使用非类型的C函数。在C 中,您可以使用Typesafe输出流:
cout << a.at(1);
std::string
at
返回char
类型。使用%s
格式指定符用于char
类型,将为您提供不确定的行为。 boom!
两件事:
1)在使用at
访问元素之前,请检查字符串的大小:at(1)
正在访问字符串的 second 字符,因为索引基于零。
2)在printf
中使用正确的格式指定符:printf("%c", a.at(1))
at()
不返回字符串,它返回字符。%s
试图将该字符解释为(非常无效的)指针。
尝试:
printf("%c", a.at(1));
(假设a
至少两个字符长)。
printf函数期望一个char指针,然后给出一个字符。炭值被解释为地址,这是错误的。
如果您只想打印一个字符,请使用:
printf("%c", a.at(1))
提供您的字符串至少2个字符。