【问题标题】:Array of strings will not print single characters [duplicate]字符串数组不会打印单个字符[重复]
【发布时间】:2019-10-22 14:04:54
【问题描述】:

我需要打印一个字符串数组的元素,每个元素由一个字符组成。通常可以使用一维字符数组,但在我的情况下,我需要使用字符串来存储这些。

我尝试了相同的代码,每个元素都比一个字符长,它似乎可以工作,但是对于单数字符我无法弄清楚。

void hands(){
    char suits[4][1] = {"A", "K", "Q", "J"};
    printf("%s", suits[0]);
}

我希望输出“A”,而不是“AKQJ {;W?”

【问题讨论】:

  • 尝试suits[4][2] 也为空终止符腾出空间。 “通常可以使用一维字符数组,但在我的情况下,我需要使用字符串来存储这些”来自您发布的 sn-p,目前尚不清楚为什么 char 不会'做这项工作。你所做的就是打印它们,你也可以用字符来做。目前,您的(固定)代码相当于int main(){printf("A");}
  • 这是以 NUL 结尾的字符串。第二个数组维度必须至少为 2。
  • 它们不会是以 NUL 结尾的字符串,NUL 没有空间。由于数组的元素是连续的,printf 遍历它们而没有找到NUL,但最终在其他地方找到了一个。
  • @Cid 我认为这将是重复的,但 Vlad 现在发布了一个很好的答案。 :)
  • @Lundin 建议的副本与问题根本不匹配。

标签: c arrays string c-strings


【解决方案1】:

要么像这样声明数组

void hands(){
    char suits[4][2] = {"A", "K", "Q", "J"};
    printf("%s", suits[0]);
}

为字符串文字的终止零字符多保留一个字符。

或者声明指向字符串字面量的指针数组,比如

void hands(){
    char * suits[4] = {"A", "K", "Q", "J"};
    printf("%s", suits[0]);
}

如果函数中的数组未更改,则在其声明前加上限定符const。例如

void hands(){
    const char suits[4][2] = {"A", "K", "Q", "J"};
    printf("%s", suits[0]);
}

在您的问题中使用此数组声明

空手(){ 字符套装[4][1] = {“A”、“K”、“Q”、“J”}; printf("%s", 西装[0]); }

然后使用转换说明符%c,而不是转换说明符%s

printf("%c", suits[0][0] );

或者您可以保留转换说明符%s,但使用诸如

之类的修饰符
printf("%1.1s", suits[0]);

【讨论】:

    【解决方案2】:

    如果您坚持“字符串”数组的长度为 1 个字符,则不会有空终止符的空间(这将要求数组长度至少为 2 个字符)。在这种情况下,您的选择是:

    1. 以 1 的“精度”打印:

      printf("%.1s", suits[0]);
      
    2. 作为字符打印:

      printf("%c", suits[0][0]);   
      

    【讨论】:

    • @Cid 谢谢。我错过了%。已更正。
    猜你喜欢
    • 2021-04-03
    • 2021-07-11
    • 2012-08-22
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多