【问题标题】:How can this string run?这个字符串如何运行?
【发布时间】:2016-12-08 06:11:51
【问题描述】:

这是一个电子词典程序。但是在这个程序中,dict[i][0]如何与空间进行比较。这将是真的。以及在最后一个if部分dict[i][0]如何比较到太空。请任何人解释。

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


int main(void)
{
    char dict[][2][40] = {
        "house","a place of dwelling",
        "car","a vehicle",
        "computer","a thinking machine",
        "program","a sequence of instruction",
        "",""
    };

    char word[80];
    int i;

    printf("Enter word: ");
    gets(word);

    i = 0;

    while(strcmp(dict[i][0], "")){
        if(!strcmp(word, dict[i][0])){
            printf("Meaning: %s", dict[i][1]);
            break;
        }
        i++;
    }

    if(!strcmp(dict[i][0], ""))
        printf("Not in dictionary\n");

    return 0;
}

【问题讨论】:

  • 在线"",""(在"program","a sequence of instruction"之后)你设置了列表的结尾; strcmp 正在寻找那个结束标记,所以它知道你在最后。你可以写 "END" 或者其他任何东西,只要你在两个地方都做同样的事情。

标签: c arrays string strcmp


【解决方案1】:

在您的代码中,

 strcmp(dict[i][0], "")

不将dict[i][0] 与) space 进行比较,而是对empty 字符串进行检查,该字符串是已定义数组的标记值。

另请注意,dict[i][0] 的类型是 char[40],它会衰减为 char *,因此无论如何这都是 strcmp() 的有效参数。

【讨论】:

  • 但如果我输入另一个不在列表中的单词,也会打印“不在字典中”。这是空字符串吗?在while循环中如何比较 dict[i][0] 到 " " 。这是否意味着 dict[i][0] 里面什么都没有。
【解决方案2】:

最好将get(word); 更改为scanf("%s", word);,因为它已被弃用并且存在缓冲区溢出问题。此外,"" 表示空字符串而不是空格。基本上,空间使用' ''\r''\t' 字符之一显示。

回到您的问题,C 中的数组被转换为该类型的指针,因此 dict[][2][40] 是一个 3D 数组,但基本上是一个大小为 2x40 的 2D 数组,这意味着该数组的每个条目都是大小为 40 的指针。

因此,您可以使用指针算法重写您的代码,方法是将dict[0] 的起始地址放入*j 指针中,并将其增加 40 乘 40 以提取 特定的 和 80 乘 80 以达到 下一个键

char *j = dict[0];
while(strcmp(j, "")){
    if(!strcmp(word, j)){
        j = j + 40;
        printf("Meaning: %s\n", j);
        break;
    }
    j = j + 80;
}

if(!strcmp(j, ""))
    printf("Not in dictionary\n");

【讨论】:

  • scanf("%s", word) 并不比gets(word) 更安全。
  • 是的,你是对的!这里有一个帖子link 说永远不要使用gets(),避免使用scanf(),但是使用fgets() 是安全但烦人的,因为您需要提前确定缓冲区大小。
  • scanf() 可以安全使用,但 "%s" 格式尤其不安全。您可以使用计数来限制它将尝试读取的字符数:"%80s"
  • 我明白了!这是在使用 scanf() 时限制字符数的简单而有效的解决方法。
猜你喜欢
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 2017-02-20
  • 1970-01-01
相关资源
最近更新 更多