strcmpfunction无法正常工作
我在结构books
数组上有一个delete
function 。 我正在传递一系列记录, author of book
name of book
和size of the list
。
现在这里给出了list[0].author
和list[5].author
和author
all等于“Dan Brown”(同一个字符串)
void delete(struct books *list,char author[],char name[],int n) { int i,a; a=strcmp(list[0].author,list[5].author); printf("%d\n",a); // prints 0 a=strcmp(list[0].author,author); printf("%d\n",a); // prints other than 0 }
为什么会这样? 这有什么不对?
从fgets
的文档:
在找到换行符时,在文件结尾或错误时停止读取。 保留换行符(如果有)。
这意味着fgets
不会从读取字符串的末尾删除最后的'\n'
。 因此,你的字符串是:
- “丹·布朗”
- “丹·布朗”
- “丹·布朗\ n”
他们不平等。
使用fgets
时这是一个非常常见的问题。 这就是为什么我通常喜欢scanf
,像这样:
char buffer[BUF_LEN]; char format[16]; int scanf_result; sprintf(format, "%%%u[^\n]", BUF_LEN); //.... do { //TODO: Ask for input scanf_result = scanf(format, buffer); switch (scanf_result) { case -1: //TODO: Print error message and exit case 0: //TODO: Print error mesage and break } //Discard remainings of buffered input line while (getchar() != '\n') {;} } while (1); //Ugly, but plain
否则,你可以使用这样的东西:
int buf_len; //TODO: Ask for input while (fgets(buffer, BUF_LEN, stdin) == NULL) { //TODO: Check and handle error } buf_len = strlen(buffer); //Remove trailing '\n', if present if (buffer[buf_len - 1] == '\n') { buffer[--buf_len] = '\0'; }
即使它更容易,我也不喜欢第二种方法,因为strlen
再次扫描字符串以确定其长度。 在大多数情况下,这不是性能问题,我避免它,因为我有自己的心理问题。
您应该validation您的输入。 有时需要多种方法。 在这里,我使用strlen()
和strstr()
,因为如果长度为==
,并且存在子串 ,则字符串ARE相等。 所以,在得出结论之前,尝试这样的方法来validation输入字符串是你的意思:
注意:枚举当然不是必需的,但包含在这里是为了增加输出示例的清晰度。
enum { SAME, //0 NOT_SAME //1 } void delete(struct books *list,char author[],char name[],int n) { int i,a, len1, len2; A = NOT_SAME; len1 = strlen(list[0].author); len2 = (list[5].author); if(strstr(list[0].author,list[5].author) && (len1==len2)) a = SAME; printf("%d\n",a); a = NOT_SAME; len1 = strlen(list[0].author); len2 = (author); if(strstr(list[0].author,author) && (len1==len2)) a = SAME; printf("%d\n",a); }
通过逐字符打印来检查第二个字符串。
特别是author
串。
for(i=0; i < strlen(list[0].author);i++) { if(list[0].author[i]!=author[i]) { printf("this is position is not matching\n",i+1); //try to print characters and also print ascii characters. break; } } //or simply try to use strncpy()