Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对字符串的查询_C++_String - Fatal编程技术网

C++ 对字符串的查询

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

这是协同部队中的一个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[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 with
std::cout.sync_with_stdio(false)
和fear
endl
,因为这会强制刷新。此后,除非库的实现很差,否则通常性能大致相同。
if (scanf("%d",&num) == 1)