【发布时间】:2021-12-29 20:26:21
【问题描述】:
我想将文本中的单词存储在二维字符数组中,其中相同的单词只存储一次。问题是程序似乎没有存储最后几个单词。我已经包含了整个程序,因为我无法找出有问题的部分。 这是我的尝试:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define N 20
#define M 110
int main() {
char text[M], c[N][N], word[N];
int i, j, k=0, l=0, d, v;
for(i=0; i<N; i++) {
for(j=0; j<N; j++) {
c[i][j]='\0';
}
}
for(i=0; i<M; i++) {
text[i]='\0';
}
for(i=0; i<N; i++) {
word[i]='\0';
}
for(i=0; i<M; i++) {
d=scanf("%c", &text[i]);
if(d==EOF) {
text[i]='\0';
break;
}
}
for(i=0; i<strlen(text); i++) {
if(isspace(text[i])==0) {
word[l]=tolower(text[i]);
l++;
}
if((i==strlen(text)-1)||((isspace(text[i])!=0)&&(isspace(text[i+1])==0))) {
for(v=0; v<i; v++) {
for(j=0; j<N; j++) {
if(word[j]!=c[v][j]) {
break;
}
}
if(j==N) {
l=0;
break;
}
}
if(v==i) {
for(j=0; j<l; j++) {
c[k][j]=word[j];
}
k++;
l=0;
}
}
}
printf("\n\n");
for(i=0; i<N; i++) {
for(j=0; j<N; j++) {
printf("%c", c[i][j]);
}
printf(" ");
}
return 0;
}
对于某些输入,并非所有单词都被打印(不存储?)。
例如输入:a b c d e f g h i k l m n o p 和 Ctrl+D,输出为:a b c d e f g h i k
我注意到如果我增加N 并提供相同的输入,打印的字数也会增加。任何帮助将不胜感激。
编辑:
如果我们替换
for(v=0; v<i; v++)
for(j=0; j<N; j++)
//...
if(j==N)
//...
if(v==i)
与
for(v=0; v<k; v++)
for(j=0; j<l; j++)
//...
if(j==l)
//...
if(v==k)
程序正常运行。
【问题讨论】:
-
"I have included the whole program, because I can't figure out the problematic part."-- 您是否尝试过在调试器中逐行运行代码,同时监视所有变量的值,以确定您的程序在什么时候停止按预期运行?如果您没有尝试过,那么您可能想阅读以下内容:What is a debugger and how can it help me diagnose problems? 您可能还想阅读以下内容:How to debug small programs?。 -
即使使用调试器并不能真正解决问题,它至少应该可以帮助您隔离问题并创建问题的minimal reproducible example,这样其他人会更容易来帮你。大多数人不会愿意为你调试整个程序,因为那应该是你的工作。
-
除了使用调试器之外,另一个技巧是使用有意义的变量名。在任何时候,您都有近 10 个单字母变量。这使得阅读和调试变得非常困难。
-
除了@kaylum 所说的之外,将其分解为具有针对性的小功能将非常有帮助。虽然我承认你可能还没有在课堂上讲过这个。
-
@JohnKall:
"I haven't used a debugger since I don't really know how to handle it yet."-- 那么这可能是改变这种状况的理想机会吗?如果您使用的是IDE,它可能具有内置调试器,或者可以轻松安装。如果您在没有 IDE 的情况下进行编译,那么您可能想要使用 GDB。您可以在 Google 中搜索GDB tutorial。