【问题标题】:printf string with "%s" loss character after sort排序后带有“%s”丢失字符的 printf 字符串
【发布时间】:2021-03-30 14:29:46
【问题描述】:

这是一个简单的排序代码:

#include <stdio.h>

int main(void) {
    int i, j;
    char str[] = "Hello!! How are you?? I'm Fine. No Thank you.", temp;

    for (i = 0; i < sizeof(str); i++) {
        for (j = i + 1; j < sizeof(str); j++) {
            if (str[i] > str[j]) {
                temp = str[j];
                str[j] = str[i];
                str[i] = temp;
            }
        }
    }

    for(i = 0; i < sizeof(str); i++)
        printf("%c", str[i]);
    printf("%s", str);
}

我发现我可以通过for循环逐个字符地打印排序的字符串,但不能打印printf("%s", str);,它不会打印任何东西,有人能告诉我为什么以及如何解决这个问题吗?

【问题讨论】:

  • 因为你的第一个字符显然是\0。打印printf("%d %d\n", strlen(str), str[0]);
  • 使用strlen(str) 而不是sizeof(str)。后者包括 NUL,也可能包括填充等内容。
  • 同样在循环前使用strlen将长度读入临时变量。
  • 您已经对字符串中的字符进行了排序,不经意包括终止 NUL 字符。终止 NUL 字符已移动到字符数组的前面,使数组看起来像一个空字符串。正如其他人所指出的那样,这是因为您使用包含终止字符的 sizeof(str) 来计算字符,而不是 strlen(str) ,后者只会计算该 char 数组的“字符串”解释中的字符数。跨度>
  • strlen() 也不是真正需要的。 i &lt; sizeof(str) --> str[i] != 0.

标签: c printf bubble-sort


【解决方案1】:

您将字符串的大小计算为sizeof(str)。这包括尾随的\0。字节\0 保证会出现在排序字符串的开头,告诉printf 该字符串实际上是空的。您希望将终止 NUL 留在字符串末尾,因为它不是您要排序的缓冲区的一部分。

要仅对字符串的字符进行排序,不使用终止符,请将循环更改为

int n = strlen(str);

for(i = 0; i < n; i++) {
    for(j = i + 1; j < n; j++) {

【讨论】:

  • 你描述的最坏情况是不可能的。在数组上使用sizeof 将为您提供确切的元素数量乘以每个元素的大小 - 没有填充。
  • 是的,@sepp2k 指出的错误应该被修复,以免在接受的答案中产生误导。
  • @sepp2k。谢谢。更新
  • @R..GitHubSTOPHELPINGICE 同意并修复
【解决方案2】:

您可以使用strlen函数来计算字符串的长度。

#include <stdio.h>
#include <string.h>
int main(void) {
    int i, j;
    char str[] = "Hello!! How are you?? I'm Fine. No Thank you.", temp;

    int n = strlen(str);

    for(i=0; i<n; i++){
        for(j=i+1; j<n; j++){
            if(str[i]>str[j]){
                temp = str[j];
                str[j]=str[i];
                str[i]=temp;
            }
        }
    }
    for(i=0; i<n; i++) printf("%c",str[i]); 
    printf("%s", str);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2016-01-03
    • 2021-12-01
    相关资源
    最近更新 更多