为什么“while”循环在满足条件时没有结束?

问题描述:

我有一个显然很容易的问题,但我只是不明白我做错了什么。 我有一个代码,将测试控制台中输入的60个字符的文本,如果在该文本中出现“恐怖主义”字样,它将提示“可疑文本”消息,当该字未出现时,将显示“没有可疑”。 输入“模式”的文本应在输入单词“完成”时结束。这似乎是我的问题,因为我的while循环不想结束。为什么“while”循环在满足条件时没有结束?

任何提示?

#include <stdio.h> 
#include <conio.h> 
#include <string.h> 
#include <stdlib.h> 

int start_with (char *sir1, char *sir2) 
{ 
    int i,j,k; 
    int len_sir2=strlen(sir2); 
    char sir3[60]=""; 
    for (i=0;i<=len_sir2;i++) 
    { 
     sir3[i]=sir1[i]; 
    } 
    k=(strcmp(sir2,sir3)) ? 0:1; 
    return k; 
} 

int main() 
{ 
    char *txt1; 
    char sir1[60]="", sir2[60]="terorist", sir_test[60]="done"; 
    int i,j,lensir1, contor=0,buf_de_la=0, buf_la; 

    while (sir1!=sir_test) 
    { 
     printf("Enter desired text and press ENTER \n"); 
     gets(sir1); 
     printf("\n"); 
     buf_la=strlen(sir1); 
     char *txt1="Nothing suspect"; 
     while (buf_de_la<buf_la-7) 
     { 
      char sirbuf[60]=""; 
      j=buf_de_la; 
      for (i=0;i<=7;i++) 
      { 
       sirbuf[i]=sir1[j]; 
       j=j+1; 
      } 

      if (start_with(sirbuf,sir2)==1) 
      { 
       txt1="SUSPECT text entered!"; 
       break; 
      } 

      buf_de_la=buf_de_la+1; 

     } 
     printf("%s\n",txt1); 
     getch(); 
     system("cls"); 
    } 

    return 0; 


} 
+3

STRCMP是你的朋友 – Morb

+0

但还是......我有我的SIR1可变文本“做”装(爵士[0 ] =“d”,sir [1] =“o”等),我可以看到调试值,但是strcmp(sir1,“done”)或strcmp(sir1,sir_test)返回0。不是1? – BogdanM

你应该使用strcmp,这样

while (strcmp(sir1, sir_test) != 0) 

这是因为当你做sir1!=sir_test,您实际测试的是,如果这两个字符数组都指向同一个比较C风格字符串地址在内存中,这是不正确的,因为它们是位于两个不同内存地址的两个不同的字符数组。

相反,您要做的是比较每个变量存储空间中包含的字符,这就是strcmp所做的:它会逐字符比较字符,直到找到空终止字符。

+0

感谢您的详细解答。 @ al-Acme给了我提示...... – BogdanM

+0

但是......我还为我的sir1变量加载了文本“done”(sir [0] =“d”,sir [1] =“o”等) ,我可以看到调试的值,但是strcmp(sir1,“done”)或strcmp(sir1,sir_test)返回0.它不是1的任何原因? - BogdanM 3分钟前编辑 – BogdanM

+0

@BogdanM strcmp返回(摘自文档):'如果lhs和rhs比较相等,则为零。所以你正在得到正确的结果。 – streppel

而不是while (sir1!=sir_test),试试这个:while (strcmp(sir1,sir_test))strcmp,strcmpi等是用于字符串比较的正确函数。它们在string.h头文件下声明。

问题出在您的比较while (sir1!=sir_test)这是错误的。它实际上比较了两个字符串的地址。您可以使用strcmp或其他各种形式的相同函数来比较字符串。

一个小的变化,这可以使你的代码工作如下..

do{ 
     printf("Enter desired text and press ENTER \n"); 
     . 
     . 
     . 
     system("cls"); 
} 
while (strcmp(sir1,sir_test));