【问题标题】:Incorrect output using strcmp使用 strcmp 输出不正确
【发布时间】:2021-04-27 19:59:09
【问题描述】:

我正在编写 HackerRank 30 天代码中的第 8 天,我遇到了 strcmp 的问题。 该代码询问用户姓名和他们的号码,然后询问其他姓名,如果之前没有输入姓名,则输出Not found,但如果是,则输出姓名和他的号码。但由于某种原因,输出仅在for 语句的最后一个循环中有效。 代码:

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

typedef struct {
    char name[100];
    int number;
} phonebook;

int main() {
    int n = 0;
    do {
        scanf("%i", &n);
    } while (n < 1 || n > 100000);
    
    int i = 0;
    phonebook people[n];
    
    for (i = 0; i < n; i++) {
        scanf("%s %i", people[i].name, &people[i].number);
    }
    
    char othernames[n][100];
    
    for (i = 0; i < n; i++) {
        scanf("%s", othernames[i]);
    }
    
    for (i = 0; i < n; i++) {
        if (strcmp(othernames[i], people[i].name) == 0) {
            printf("%s=%i\n", people[i].name, people[i].number);
        } else {
            printf("Not found\n");
        }
    }
    return 0;
}

【问题讨论】:

  • strcmp(othernames[i], people[i].name) 不应该有第二个循环,以便将每个othernames 与每个people[].name 进行比较?
  • char othernames[100][n]; 应该是char othernames[n][100];
  • %s 扫描单个空格分隔的单词。你确定每个名字只有一个词吗?
  • 或者为什么要存储othernames 的整个列表?除了将其与电话簿进行比较外,您不需要任何给定的空间,因此在阅读后立即将每个电话簿与电话簿进行比较,然后为下一个重新使用相同的空间,会更节省内存并且不会更复杂.

标签: c string strcmp


【解决方案1】:

每次都没有找到othernames从头到尾比较people,所以需要替换

for (i = 0; i < n; i++) {
  if (strcmp(othernames[i], people[i].name) == 0) {
    printf("%s=%i\n", people[i].name, people[i].number);
  } 
  else {
    printf("Not found\n");
  }
}

到

bool found = false;
for (i = 0; i < n; i++) {
  for ( j = 0 ; j < n ; j++ ) {
    if (strcmp(othernames[j], people[i].name) == 0) {
      printf("%s=%i\n", people[i].name, people[i].number);
      found = true;
    } 
  }
}

if ( found == false ) printf("Not found\n");

【讨论】:

  • 谢谢,我只是以不同的方式实现它,我将 bool 放在循环内部,因为如果它在外部,当它变为 true 时,它​​总是正确的,对吗?它有效,但现在的问题是代码仍然需要很长时间才能执行。我认为这是因为 strcmp 在循环中被调用了很多次。
【解决方案2】:

问题是othernames 应该只是char 的数组,而不是矩阵。对于输入的每个其他姓名,您必须扫描整个电话簿才能找到它或显示Not found。按照编码,您只需测试键入的第 i 个其他名称是否恰好对应于电话簿中的第 i 个条目。

这是修改后的版本:

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

typedef struct {
    char name[100];
    int number;
} phonebook;

int main() {
    int n = 0;
    do {
        if (scanf("%i", &n) != 1)
            return 1;
    } while (n < 1 || n > 100000);
    
    phonebook people[n];
    
    for (int i = 0; i < n; i++) {
        if (scanf("%99s %i", people[i].name, &people[i].number) != 2)
            return 1;
    }
    
    for (int i = 0; i < n; i++) {
        char othername[100];
    
        if (scanf("%99s", othername) != 1)
            break;
    
        int j;
        for (j = 0; j < n; j++) {
            if (strcmp(othername, people[j].name) == 0) {
                printf("%s=%i\n", people[i].name, people[i].number);
                break;
            }
        }
        if (j == n) {
            printf("Not found\n");
        }
    }
    return 0;
}

请注意,将电话号码存储为 int 值可能不是一个好主意。最好使用char 数组,这样初始的0 就很重要,并且可以存储更长的数字。

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2014-11-03
    相关资源
    最近更新 更多