C++ 对字符串的查询
这是协同部队中的一个B问题 我提交了这个代码,但我得到了错误的答案。 这是蛮力没什么特别,但我在解决问题方面是新手C++ 对字符串的查询,c++,string,C++,String,这是协同部队中的一个B问题 我提交了这个代码,但我得到了错误的答案。 这是蛮力没什么特别,但我在解决问题方面是新手 #include <iostream> #include<string> using namespace std; int main() { char x[10000]; scanf_s("%s",x); int num; scanf_s("%d",&num); int *l = new int
#include <iostream>
#include<string>
using namespace std;
int main()
{
char x[10000];
scanf_s("%s",x);
int num;
scanf_s("%d",&num);
int *l = new int[num];
int *r = new int[num];
int *k = new int[num];
for(int i =0;i<num;i++)
{
scanf_s("%d,%d,$d",&l[i],&r[i],&k[i]);
}
char temp;
for(int i =0; i<num;i++)
{
for (int j =0;j<k[i];i++)
{
temp= x[l[i]-1];
x[l[i]-1]=x[r[i]-1];
x[r[i]-1]=temp;
}
}
printf("%s",x);
return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
char x[10000];
扫描频率(“%s”,x);
int-num;
scanf_s(“%d”和&num);
int*l=新的int[num];
int*r=新的int[num];
int*k=新的int[num];
对于(int i=0;i> p> <代码> SCANF是C函数。<代码> String 是C++数据类型。C++经常使用C数据类型,但是C非常罕见使用C++数据类型。 SCANF在C++存在之前20年左右,没有线索“<代码>字符串< /代码>是什么。< /P>
接下来,scanf
接受一个参数。它不知道参数类型是否正确,也不容易检查。它假设程序员知道他们在做什么
最终结果是,它尝试将字符
数据按%s
格式选项的指定放入字符串
。该字符串
用不兼容的数据写入
将scanf
替换为
cin >> x;
<>和C++>另一种方法是避开C++,去C++样式:
char x[appropriate size goes here];
scanf("%s",x);
不知道合适的大小?这将是一个问题。string
会根据需要调整大小。scanf
所需的char
数组无法调整大小。如果读取的数据超过了可以容纳的数量,则会出现未定义的行为
在
%d
表示程序员传入一个指向整数的指针,在这种情况下,它将是num
的位置,以便scanf
可以用读取的任何内容更新存储在num
的值。传入了num
的值。scanf
假定这是一个指针,并且没有定义lts.num
中任何未初始化的垃圾值都很可能被用作内存位置,并且某些未被怀疑的内存块被覆盖。这将在将来的某个时候,当您实际需要该内存中的数据时,导致问题
scanf("%d",&num);
或者用C++
cin >> num;
剩下的问题是前两个问题的变体
scanf("%d,%d,%d",l[i],r[i],k[i]);
需要指针
scanf("%d,%d,%d",&l[i],&r[i],&k[i]);
及
需要字符
数组,而不是字符串
printf("%s",x.c_str());
获取与字符串
等效的字符
数组
printf("%s",x.c_str());
建议:以更高级别的不容忍度编译编译器可以生存的错误。在g++中,我至少使用-pedantic-pedantic errors-Wall-Wextra-Werror
在逻辑方面,您的输入都是未经检查的。当您的程序尝试处理非数字输入时,用户可以为num
键入“rutabaga”,结果可能很滑稽。同样,未定义的行为。该程序可能崩溃。它可能会锁定。它可能会使雄性骆驼怀孕
在C中++
if (cin >> num)
将捕获一些但不是所有形式的错误输入。如果此测试失败,则num
的内容未定义且不应使用。此外,在确认并清除错误之前,流将处于错误状态且无法读取。在C中,等效值为
if (scanf("%d",&num) == 1)
如果scanf
只读取一个值,num
,则一切正常。读取任何其他数量的值都意味着scanf
未成功,并且num
的内容未定义。您没有优化未编译的代码。编译错误最有可能是由于被视为错误的警告造成的。您是否查看你的编译器给你的警告?例如,你使用的代码> SCANF完全错误。扫描到字符串中。是的,这很好。扩展到@ BoGrad的注释。<代码> SCANF是C函数。<代码> String < /Cord>是C++数据类型。C++经常使用C数据类型,但是C非常罕见,可以使用C++数据类型。将代码< > SCAFF <代码> > <代码> CIN > x<代码>,并转到所有C++。替代的是避开C++和<代码> SCAFF <代码>到<代码> char x [适当的大小在这里] < /Cord>。不知道适当的大小?这将是C.在代码> SCANF(“%d”,num)中的一个问题。;
,scanf
需要一个指向num
的指针,num
的位置,这样它就可以更新存储在num
的值。剩下的问题是前两个问题的变体。好的,我会试试这个。我只想澄清一下我使用printf和scanf的原因,因为cin&cout要慢得多,而且在测试用例中有时间限制。有时我会因为使用cin和cout而得到错误的答案。谢谢你的注释。虽然我发布这个问题的主要原因是不知道如何使用printf和scanf,但这并不是主要问题。我只是要求这个想法本身来解决我上面提到的问题。我在代码中更新了你的注释。流IO是o只有在使用不当时才会变慢。关闭stdout synch withstd::cout.sync_with_stdio(false)
和fearendl
,因为这会强制刷新。此后,除非库的实现很差,否则通常性能大致相同。
if (scanf("%d",&num) == 1)