我写了一些代码,使用户选择从字符串中删除字符,现在我想在用户选择的末尾添加一个字符。这是我第一次做这样的事情,因此我真的迷失在需要更改/添加的内容上。我想我需要使用strcpy复制用户写入的字符串,然后将新字符串以某种方式添加到第一个字符串,这是我丢失的部分,因为我想使用相同的代码并进行一些更改因此可以看出添加字符和删除字符之间的区别。
答案 0 :(得分:1)
将char附加到C字符串。
dynamic-如果需要重新分配,则为1。如果str是静态或动态分配的,并且具有足够的空间来容纳新的char,则为0。
char *appendchar(char *str, int ch, int dynamic)
{
char *tmp;
if(dynamic)
{
tmp = realloc(str, strlen(str) + 2);
str = tmp;
}
if(str)
{
size_t len = strlen(str);
str[len] = ch;
str[len + 1] = 0;
}
return str;
}
答案 1 :(得分:1)
很明显,您在掌握用户输入功能的使用和程序的整体逻辑方面有些困难。您认为以下内容是什么?
printf("Enter a sentence: \n");
fgets(str, 100, stdin);
if (fgets(str, 100, stdin) == NULL) {
...
用户期望输入几句话?两次调用fgets
似乎不是您想要的-一次就足够了(除去您无法检查返回值的那个),而使用{{ 1}}是正确的选择。
(也注意:)不向您的外壳返回负值,例如fgets
,而只是返回fgets
来指示错误情况(或return -1;
中提供的宏1
,它被奇怪地定义为EXIT_FAILURE
)
我们在讨论定义的常量时,请避免在代码中使用 magic-numbers (例如,在stdlib.h
中,1
是 magic-number )。相反:
char str[100];
由于您将100
声明为#define MAXC 100 /* if you need a constant, #define one (or more) */
...
char str[MAXC] = "";
个字符的数组,因此您知道,如果您已经有str
的字符串,则无需提示输入要添加的字符加上终止符。因此,您需要保存字符串的长度。您使用100
是从99 chars
修剪试验strcspn
的好方法,但是您已经在'\n'
中向前扫描以找到str
和< em> nul-terminate 那里的字符串-和-str
返回'\n'
的起始段的字符数,该段不包含strcspn
(即它将返回长度,因此只需保存即可)
str
代码的其余部分仅是检查'\n'
以确保有足够的空间来添加字符,然后提示并调用 str[(len = strcspn(str, "\n"))] = 0; /* save len */
,在{{1}处添加新字符},然后再次在len < MAXC - 1
处 nul-terminate getchar
。您可以执行以下操作:
str[len]
(注意:,当添加新字符时,通过增加str
,您可以将新字符串的长度保留在len+1
中,并保存以备以后使用)
将其完全放在一起,您将获得以下内容:
if (len < MAXC - 1) {
printf ("\nEnter character to add: ");
if ((r = getchar()) != EOF) {
str[len++] = r;
str[len] = 0;
printf ("This is the sentence: '%s' (len: %zu)\n", str, len);
}
else
fputs ("(user canceled input.)\n", stderr);
}
else {
fputs ("\nerror: insufficient space to add char.\n", stderr);
return 1;
}
(请注意,如果您未在输出格式字符串内提供转换,例如len
或len
等,则无需调用#include <stdio.h>
#include <string.h>
#define MAXC 100 /* if you need a constant, #define one (or more) */
int main (void) {
char str[MAXC] = "";
size_t len;
int r;
printf("Enter a sentence: "); /* no newline needed */
if (fgets(str, MAXC, stdin) == NULL) {
fputs ("fgets failed\n", stderr); /* no need for fprintf */
return 1; /* do not return negative values to your shell */
}
str[(len = strcspn(str, "\n"))] = 0; /* save len */
printf ("This is the sentence: '%s' (len: %zu)\n", str, len);
if (len < MAXC - 1) {
printf ("\nEnter character to add: ");
if ((r = getchar()) != EOF) {
str[len++] = r;
str[len] = 0;
printf ("This is the sentence: '%s' (len: %zu)\n", str, len);
}
else
fputs ("(user canceled input.)\n", stderr);
}
else {
fputs ("\nerror: insufficient space to add char.\n", stderr);
return 1;
}
}
或%s
。您只需调用%d
或printf
即可输出文字字符串。一个好的编译器将为您进行优化。)
使用/输出示例
fprintf
(如果您最初输入的是puts
字符串,则不会提示您输入其他字符,并且会显示错误消息fputs
)
仔细检查一下,如果还有其他问题,请告诉我。