如何在 C 中的给定字符串中删除溢出字符或追加字符?
How do I remove overflow characters or append characters in a given string in C?
我基本上想要一个任意长度的字符串但是一个固定大小的输出字符串。因此,如果我分配 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 打印到游戏屏幕上,我得到我的文字和一些未知字符。抱歉,我不能 post 整个游戏代码,因为它的 4000 行长分成 10 个文件。我会欣赏一种完全不同的方法,即从更多字符的字符串中获取仅 40 个字符的字符串。
在第三个printf
调用中,如果你想在位置1显示字符,你应该这样做:
printf("%c", x[1]);
要附加字符串,请查看strcat
:http://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 */
好吧,你可以为它编写自己的函数:
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;
}
像这样:
printf("%-5.5s", x);
格式转换%-5.5s
由以下部分组成:
- - (flag) 如有必要,在右侧填充输出
- 5(字段宽度)输出至少5个字符
- .5(精度)最多使用字符串的5个字符
- s(转换)对应的参数是一个
char*
指向一个字符串
有关详细信息,请参阅 man sprintf
如果您的意图是 运行 分类或扩展调用 sprintf
的 结果 (这是对评论的可能解释) ,那么答案是使用 snprintf
,但前提是您准备好将 t运行cation 放在格式化输出的末尾。这是一个小玩具:
#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;
}
测试运行:
$ ./snp 12 3 kangaroos 10 kangaroos 125 kangaroos \
3 koalas 14 koalas 173 koalas 1294 koalas \
12964 koalas 127347 koalas
|3 kangaroos |
|10 kangaroos|
|125 kangaroo|
|3 koalas |
|14 koalas |
|173 koalas |
|1294 koalas |
|12964 koalas|
|127347 koala|
我基本上想要一个任意长度的字符串但是一个固定大小的输出字符串。因此,如果我分配 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 打印到游戏屏幕上,我得到我的文字和一些未知字符。抱歉,我不能 post 整个游戏代码,因为它的 4000 行长分成 10 个文件。我会欣赏一种完全不同的方法,即从更多字符的字符串中获取仅 40 个字符的字符串。
在第三个printf
调用中,如果你想在位置1显示字符,你应该这样做:
printf("%c", x[1]);
要附加字符串,请查看strcat
:http://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 */
好吧,你可以为它编写自己的函数:
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;
}
像这样:
printf("%-5.5s", x);
格式转换%-5.5s
由以下部分组成:
- - (flag) 如有必要,在右侧填充输出
- 5(字段宽度)输出至少5个字符
- .5(精度)最多使用字符串的5个字符
- s(转换)对应的参数是一个
char*
指向一个字符串
有关详细信息,请参阅 man sprintf
如果您的意图是 运行 分类或扩展调用 sprintf
的 结果 (这是对评论的可能解释) ,那么答案是使用 snprintf
,但前提是您准备好将 t运行cation 放在格式化输出的末尾。这是一个小玩具:
#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;
}
测试运行:
$ ./snp 12 3 kangaroos 10 kangaroos 125 kangaroos \
3 koalas 14 koalas 173 koalas 1294 koalas \
12964 koalas 127347 koalas
|3 kangaroos |
|10 kangaroos|
|125 kangaroo|
|3 koalas |
|14 koalas |
|173 koalas |
|1294 koalas |
|12964 koalas|
|127347 koala|