检查下列代码错误#include<bits/stdc++.h> using namespace std; char s[13][20]={'\0'}; struct ArcNode { int adjest; ArcNode *next; }; typedef struct { int vertex; int count; ArcNode firstedge; } VNode; class AdjGraph { private: int VertexNum; int ArcNum; public: VNode adjlist[100]; AdjGraph(int a[],int n,int e); ~AdjGraph(); }; AdjGraph::AdjGraph(int a[],int n,int e) { int i,j,k; VertexNum=n; ArcNum=e; for(i=1;i<=VertexNum;i++) { adjlist[i].vertex=a[i]; adjlist[i].firstedge=NULL; } int q; for(k=0;k<ArcNum;k++) { char s2[20]={'\0'}; char s3[20]={'\0'}; char s0[20]={'\0'}; cin>>s2; cin>>s3; for(q=1;q<=n;q++) { strcpy(s0,s[q]);/**/ if(strcmp(s0,s2)==0) i=q; if(strcmp(s0,s3)==0) j=q; } ArcNode s=new ArcNode; s->adjest=j; s->next=adjlist[i].firstedge; adjlist[i].firstedge=s; } } AdjGraph::~AdjGraph() { } void TopSort(AdjGraph G,int n) { int i,j,l=0; int b[100]={0}; int top=-1; stack<int> s; ArcNode p; for (i=1;i<=n;i++) G->adjlist[i].count=0; for (i=1;i<=n;i++) { p=G->adjlist[i].firstedge; while (p!=NULL) { G->adjlist[p->adjest].count++; p=p->next; } } for (i=n;i>0;i--) if (G->adjlist[i].count==0) { s.push(i); } while (top>-1) { i=s.top(); s.pop(); b[l]=i; l++; p=G->adjlist[i].firstedge; while (p!=NULL) { j=p->adjest; G->adjlist[j].count--; if (G->adjlist[j].count==0) { s.push(j); } p=p->next; //找下一个邻接点 } } if(l!=n) { cout<<"False"; } else { for(i=0;i<l;i++) { cout<<s[b[i]]; if(i!=n-1) cout<<endl; } } } int main() { int n,e,i; ArcNode p; cin>>n>>e; char s1[20]={'\0'}; for(i=1;i<=n;i++) { cin>>s1; strcpy(s[i],s1); } int a[100]={0}; for(i=1;i<=n;i++) { a[i]=i; } AdjGraph A(a,n,e); / for(i=1;i<=n;i++) { cout<<A.adjlist[i].vertex<<"--->"; p=A.adjlist[i].firstedge; while(p!=NULL) { cout<<p->adjest<<"--->"; p=p->next; } cout<<endl; } */ AdjGraph *G=&A; TopSort(G,n); return 0; }
时间: 2023-12-04 13:01:40 浏览: 100
这段代码存在以下错误:
1. 头文件包含了 `#include<bits/stdc++.h>`,这是不标准的写法。应该只包含需要使用的头文件,例如可能需要包含 `<iostream>`、`<cstring>`、`<stack>`等等。
2. 在定义 `char s[13][20]` 数组时,使用了单引号,这是字符类型的写法,应该使用双引号表示字符串,例如 `char s[13][20] = {"\0"}`。
3. 在 `TopSort` 函数中,`AdjGraph G` 的类型应改为指针类型,即 `AdjGraph *G`,因为 `A` 是在 `main` 函数中定义的,是个局部变量,在函数执行完之后就会被销毁,而 `TopSort` 函数需要使用 `A` 中的数据,所以应该将其传入函数中。
4. 在 `TopSort` 函数中,有多处使用了 `->` 运算符,但是 `G` 是一个指针,应该使用 `*G` 来访问其指向的对象。
5. 在 `TopSort` 函数中,使用了 `stack<int> s` 定义了一个栈,但是在后面使用的时候没有使用 `s`,而是使用了 `G->adjlist`,这是错误的。
6. 在 `TopSort` 函数中,最后一行应该返回 `0`,而不是 `return l;`。
相关问题
#include<bits/stdc++.h> using namespace std; int main(){ char s; while(cin>>s,s!='\0'){ cout<<s; } return 0; }为什么循环没有停止?
这段 C++ 代码是一个简单的程序,它通过无限循环读取用户输入并逐个打印字符,直到遇到空字符('\0')为止。`while` 循环条件 `cin >> s, s != '\0'` 的逻辑是这样的:
1. 当从标准输入 (`cin`) 中读入一个字符赋值给 `s` 后,`cin >> s` 会继续等待用户输入下一个字符,除非按下 Enter 键或遇到非字符输入。
2. 如果输入的是一个非空字符(包括空格、数字或其他特殊字符),`s` 将不会等于空字符,所以循环将继续。
3. 只有当用户输入了一个空字符('\0'通常出现在字符串结束时),条件才会变为 `false`,循环才会终止。
因此,如果用户始终未输入空字符就关闭了程序或程序没有提供其他退出机制,这个循环就会一直运行下去,直到手动停止。为了避免这种无限制的循环,可以在循环内部添加一个条件检查或在适当的时候显式地设置一个退出标志,比如添加一个计数器或判断一个特定的结束标志。例如:
```cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
char s;
bool stop = false; // 添加一个标志用于控制循环
while (cin >> s, !stop) { // 修改循环条件
if (s == '\0') {
stop = true; // 输入空字符时,设置停止标志
} else {
cout << s;
}
}
return 0;
}
``` #include<bits/stdc++.h> using namespace std; int main() { char s[10000000]; getline(s,cin); } ```
该C++代码中存在两个主要问题:
1. 未包含`#include <string>`:`getline()`函数需要`<string>`库来正确工作。
2. 传递给`getline()`的参数类型不匹配:`getline()`通常用于读取字符串,但在这里你试图将一个字符数组`s`传递给它,而不是一个引用或指针到`std::string`对象。
修复这两个问题后,完整的代码如下:
```cpp
#include <bits/stdc++.h>
#include <string> // 添加对<string>库的包含
using namespace std;
int main()
{
string s; // 使用std::string而非char数组
getline(cin, s); // 使用cin并传入string类型的变量s
return 0;
}
```
错误分析:
- 错误1:`#include <string>` 缺失,导致无法使用`std::string`类及其相关函数(如`getline()`)。
- 错误2:将`char s[10000000];`改为`string s;`以适应`getline()`,因为getline()是用于读取字符串的,而字符数组不能直接作为其参数。
修复后的代码解决了这些问题,并且可以正常从标准输入读取一行文本。
阅读全文