【问题标题】:printing a string in a specific format以特定格式打印字符串
【发布时间】:2020-05-04 17:35:08
【问题描述】:

所以我创建了一个程序,它基本上可以打印任何给定的字符串:

示例: 输入:

Hello

输出:

Hello
ello
llo
lo
o

问题是,由于某种原因,如果我使用 icdiff 并将我的输出与文本文件中的输出进行比较,它会说我缺少元素并且我有更多的空格。

icdiff 输出:

Hello
 ello
  llo

如您所见,这与我所拥有的明显不同,但如果我在终端上测试它,我会得到预期的输出。

程序:

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

void print_array(char *p, int tamanho) {
    int i;
    for (i = 0; i < tamanho; i++) {
        printf("%c", p[i]);
    }
    printf("\n");
}

void nova_str(char *p, char *s, int inicio, int tamanho) {
    int i;
    for (i = inicio; i < tamanho; i++) {
        s[i] = p[i];
    }
}

int main() {
    char p[1001];
    int len;
    int j;
    scanf("%s", p);
    len = strlen(p);
    print_array(p, len);
    for (j = 1; j < len; j++) {
        char *np = (char *)calloc(len + 1, sizeof(char));
        nova_str(p, np, j, len);
        print_array(np, len);
        free(np);
    }
    return 0;
}

任何帮助都将不胜感激。

【问题讨论】:

  • calloc(2,sizeof(char)) 你总是分配 2 个字节的内存,即使你使用了 len+1 字节。
  • 好的,我更正了,但它仍然给我这个错误

标签: c arrays string pointers


【解决方案1】:

问题出在nova_str 函数中:您在源和目标中使用相同的索引,因此目标数组仍然以initcio 空字节开头,这些字节由print_array 打印并显示为空格你的系统。数组由calloc() 初始化为所有位为零。

这是一个更简单的版本:

#include <stdio.h> 

int main() {
    char p[1001];
    if (scanf("%1000s", p) == 1) {
        for (int i = 0; p[i] != '\0'; i++) {
            /* print the word starting at offset i */
            printf("%s\n", p + i);
        }
    }
    return 0;
}

【讨论】:

  • 谢谢伙计,它起作用了,可能我把它复杂化了很多,但公平地说,我不擅长用指针编程
  • @MartimCorreia:我很高兴 :) 您的解决方案有点复杂,但并非不合逻辑。您可以通过编写s[i - inicio] = p[i]; 来修复nova_str,您应该通过传递正确数量的字符来修改main() 以打印:print_array(np, len - j);。然后你会认为不需要复制,你可以打电话给print_array(p + i, len - i);。进一步简化,您将像我一样直接打印字符串部分,因为它以空值终止的部分。简单的解决方案并不总是立即出现。不断从实践和例子中学习。
【解决方案2】:

calloc() 将内存设置为零,因此当它应该是空格时,您在 print_array() 中打印空字符。用空格替换那些空字符就可以解决了,尽管我认为有一种更简单的方法可以实现你想要做的事情。

如果您不想在字母前添加空格,请改为在 print_array() 中的 printf() 之前添加 if (p[i] == '\0') continue;

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2020-08-05
    • 2016-06-21
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多