如何删除C中给定字符串中的溢出字符或附加字符?

时间:2015-03-02 00:14:42

标签: c arrays string resize

我基本上想要一个任意长度的字符串,但是一个固定大小的输出字符串。因此,如果我为x分配一个包含10个字符的字符串,我希望在第二个printf处以5个字符的字符串结尾。如果x是3个字符,我想添加空格以使字符串为5个字符。 这是我到目前为止的代码,但它不起作用,因为我甚至无法访问索引,它是段错误的;

int main()
{
    char x[] = "d dddddddd";
    printf(x);
    printf("");
    // separate
    printf(x[1]);
    return 0;
}

谢谢,我想知道这在C中是否可行,但您也可以在C ++中尝试

编辑: 我的2个代码在这里,它们都溢出了;

char first[40];
char g[] = "     Level %d      %d Fruit    %d:%d      ";
char d[41] = {0};   
strncpy(d, g, 40);
if(strlen(d) < 40) {
    for(i = strlen(d); i < 40; i++) {
        d[i] = ' ';
    }
}
n = sprintf(first, d, gol, gift, minutes, secs );

第二战略;

char first[40];
char b[40];
strncpy(b, g, sizeof(b));
fgets(b, 40, stdin);                          
n = sprintf(first, b, gol, gift, minutes, secs );

将我的n打印到游戏的屏幕上,我收到了我的文字和一些未知字符。对不起,我无法发布整个游戏代码,因为它的4000行长分为10个文件。我会欣赏一种完全不同的方式,从一串多个字符中获取一个只有40个字符的字符串。

3 个答案:

答案 0 :(得分:2)

像这样:

printf("%-5.5s", x);

格式转换%-5.5s由以下内容组成:

  • - (flag)如果需要,填充右侧的输出
  • 5 (字段宽度)输出至少5个字符
  • .5 (精度)最多使用5个字符的字符串
  • s (转换)相应的参数是指向字符串的char*

有关详细信息,请参阅man sprintf

如果您打算截断或扩展对sprintf的调用的结果(这可能是对评论的解释),那么答案就是使用{{1} },但仅当您准备将截断作为格式化输出的末尾时。这是一个小玩具:

snprintf

试运行:

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

int main(int argc, char** argv) {
  int limit = atoi(argv[1]);
  for (int j = 2; j < argc - 1; j+=2) {
    int n = atoi(argv[j]);
    char buffer[limit + 1];
    # format split into two for explanatory purposes:
    #   %d %s   is the format for the output
    #   %*.0s   takes two arguments, length and "",
    #           and adds length spaces to the end of the output
    # Because we're using snprintf, the output is truncated.
    if (snprintf(buffer, limit+1, "%d %s" "%*.0s",
                 n, argv[j+1],
                 limit, "") < 0) {
      perror("snprintf");
      return 1;
    }
    if (strlen(buffer) != limit)
      fprintf(stderr, "buffer length is %zd instead of %d\n",
                      strlen(buffer), limit);
    printf("|%s|\n", buffer);
  }
  return 0;
}

答案 1 :(得分:1)

在第三次printf来电中,如果你想在第一位显示角色,你应该这样做:

printf("%c", x[1]);

要附加字符串,请查看strcathttp://www.cplusplus.com/reference/cstring/strcat/?kw=strcat

例如:

char first[1000] = "Hello", sec[] = " world";
strcat(first, sec); /* destination, source */

但是strcat是不安全的,所以请自己设置安全的strcat:

char *safecat(char *dest, const char *src, size_t siz)
{
    return strncat(dest, src, siz);
}

要阅读最多 n 个字符,请阅读fgets,将stdin作为信息流传递:http://www.cplusplus.com/reference/cstdio/fgets/?kw=fgets

例如:

char buf[MAXBUF];
fgets(buf, MAXBUF, stdin); /* this only reads MAXBUF - 1  characters. The
                              rest is left in stdin */                                                         

答案 2 :(得分:1)

你可以为它编写自己的函数:

void print_five(char *s)
{
    int i = 0;
    char d[6] = {0};
    strncpy(d, s, 5);
    if(strlen(d) < 5) {
        for(i = strlen(d); i < 5; i++) {
            d[i] = ' ';
        }
    }
    printf("%s", d);    

}


int main(void)
{
    char d[10] = "helloooo";
    char m[4] = "h";
    print_five(d);
    printf("continued\n"); //hellocontinued
    print_five(m);
    printf("continued\n"); //h    continued
    return 1;
}