c - 卡在向字符串添加字符
问题描述
我编写了一些代码,使用户选择的字符从字符串中删除,现在我想在用户选择的最后添加一个字符。这是我第一次做这样的事情,所以我真的迷失了需要更改/添加的内容。我想我需要使用 strcpy 来复制用户写入的字符串,然后以某种方式将新字符串添加到第一个字符串中,这是我丢失的部分,因为我想使用相同的代码并进行一些更改因此可以看出添加字符和删除字符之间的区别。
解决方案
很明显,您在掌握用户输入功能的使用和程序的整体逻辑方面有些困难。您认为以下内容有什么作用?
printf("Enter a sentence: \n");
fgets(str, 100, stdin);
if (fgets(str, 100, stdin) == NULL) {
...
用户预计输入多少个句子?调用fgets
两次似乎不是您想要的——一次就足够了(删除您未能检查返回的那个) 虽然重复fgets
调用不是您所需要的,但使用fgets
用户输入是正确的选择。
(另请注意:不要向您的 shell返回负值return -1;
,例如,而是简单地返回1
以指示错误条件(或 中EXIT_FAILURE
提供的宏stdlib.h
,奇怪地定义为1
)
当我们谈论定义的常量时,请避免在代码中使用幻数(例如 in char str[100];
,100
是幻数)。反而:
#define MAXC 100 /* if you need a constant, #define one (or more) */
...
char str[MAXC] = "";
由于您声明str
为一个字符数组,因此您知道如果您已经有一个字符串加上nul 终止100
字符,则不需要提示输入要添加的字符。所以你需要保存字符串的长度。您使用是一种修剪试验的好方法,但您已经在向前扫描以找到并nul 终止那里的字符串 - 并且 -返回不包括的初始段的字符数(即它将返回长度,所以只需保存它)99 chars
strcspn
'\n'
str
str
'\n'
strcspn
str
'\n'
str[(len = strcspn(str, "\n"))] = 0; /* save len */
剩下的代码只是简单的检查一下len < MAXC - 1
,确保有足够的空间来添加字符,然后提示并调用getchar
,在 at 添加新字符,str[len]
然后在 at再次nul-terminate 。你可以做类似的事情: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
or%d
等,则无需调用printf
or fprintf
。您可以简单地调用puts
orfputs
来输出文字字符串。一个好的编译器将使为您进行的优化。)
示例使用/输出
$ ./bin/straddchr
Enter a sentence: 123456
This is the sentence: '123456' (len: 6)
Enter character to add: 7
This is the sentence: '1234567' (len: 7)
(如果您最初输入的是99
字符串,则不会提示您输入额外的字符,并且会显示错误消息"insufficient space to add char."
)
如果您还有其他问题,请仔细查看并告诉我。
推荐阅读
- email - SMTP 和整个电子邮件流程
- swift - UIKit:如何调整 Viewcontroller 的大小以适应 splitview 主列?
- godot - Godot 将 fbx 文件重新打包到 res(或 scn)
- bash - 让脚本找到所有包含 x 的行,将这些行添加到后面的每一行,除非该行中有另一个 x,此时重复
- typescript - VScode 不建议 TS mongoose 字段类型
- validation - 根据 gitlab 中的提交验证文件(文件级别验证)
- android - Android自定义对话框不显示标题和消息
- sql - 从 oracle 中选择行号和计数
- c# - C#将数组传递给数组但仍然出现“无法从'string []'转换为'string'”错误
- python - Python数组和numpy数组组合