首页 > 解决方案 > 卡在向字符串添加字符

问题描述

我编写了一些代码,使用户选择的字符从字符串中删除,现在我想在用户选择的最后添加一个字符。这是我第一次做这样的事情,所以我真的迷失了需要更改/添加的内容。我想我需要使用 strcpy 来复制用户写入的字符串,然后以某种方式将新字符串添加到第一个字符串中,这是我丢失的部分,因为我想使用相同的代码并进行一些更改因此可以看出添加字符和删除字符之间的区别。

标签: cstring

解决方案


很明显,您在掌握用户输入功能的使用和程序的整体逻辑方面有些困难。您认为以下内容有什么作用?

    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 charsstrcspn'\n'strstr'\n'strcspnstr'\n'

    str[(len = strcspn(str, "\n"))] = 0;    /* save len */

剩下的代码只是简单的检查一下len < MAXC - 1,确保有足够的空间来添加字符,然后提示并调用getchar,在 at 添加新字符,str[len]然后在 at再次nul-terminate 。你可以做类似的事情:strlen+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;
    }
}

(请注意,如果您没有在输出格式字符串中提供转换,例如%sor%d等​​,则无需调用printfor fprintf。您可以简单地调用putsorfputs来输出文字字符串。一个好的编译器将使为您进行的优化。)

示例使用/输出

$ ./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."

如果您还有其他问题,请仔细查看并告诉我。


推荐阅读