char s[11],关于长度问题

按行输入字符串,从中摘出词并建立词表。当词表中的词满20个或发现名为QUIT的词时,显示出词表,程序结束。词表中不得有重复的词,每个词长度不超过10.
#include<iostream>
#include<string>
using namespace std;
void main()
{
char s[11],dict[20][11];
int i=0,j;
while(i<20){
cin>>s;
if(!strcmp(s,"QUIT"))
break;
for(j=0;j<i;j++)
if(!strcmp(s,dict[j]))
break;
if(j==i){
strcpy(dict[i],s);
i=i+1;
}
}
for(j=0;j<i;j++)
cout<<dict[j]<<endl;
}

一,其中char s[11],dict[20][11];
为什么是s[11],不是长度不超过10吗,为什么不是s[9],从s[0]开始算呢。
二,if(!strcmp(s,"QUIT"))
break;
为什么前面要有“!”才表示为如果相等就跳出。此句为什么不是表示如果不相等就跳出。

期待解释
最新回答
悦心自足

2024-11-24 20:03:05

1. 字符串变量规定其数组最后一位为'/0',是字符串结束标志.
那么单词长度不超过10的话,那么最后还有一位'/0'即11位.

2. strcmp(char* a,char* b)函数的返回值规定如下
若字符串a的ASCII码值大于字符串b,返回其差值(正数)
若字符串a的ASCII码值小于字符串b,返回其差值(负数)

若字符串a的ASCII码值等于字符串b,返回0

那么,s == "QUIT"时,
strcmp(s,"QUIT") = 0

这时候,要想if条件成立(即括号内表达式为非零)
必须加一个"!",
让!strcmp(s,"QUIT") = 1

这样就满足if条件,实现break 跳出.