将字符串附加到C中的另一个字符串,不包含任何空格

时间:2016-01-08 07:41:18

标签: c

这是我在这个论坛的第一篇文章,所以请耐心等待。

我需要制作一个简短的程序,用户可以输入2个字符串,之后应该附加。 我已经在下面得到了这个代码(我不允许使用其他"包含")。

我需要知道的是:我如何否认用户将进入的任何空格?

示例:1。String" Hello" | 2. String" World"

结果应该是" HelloWorld"而不是" Hello World"。

#include <stdio.h>

void main()
{
    char eingabe1[100];
    char eingabe2[100];
    int i = 0;
    int j = 0;
    printf("Gib zwei Wörter ein, die aneinander angehängt werden sollen\n");
    printf("1. Zeichenkette: ");
    gets(eingabe1);
    printf("\n");
    printf("2. Zeichenkette: ");
    gets(eingabe2);
    printf("\n");

    while (eingabe1[i] != '\0')
    {
        i++;
    }

    while (eingabe2[j] != '\0')
    {
        eingabe1[i++] = eingabe2[j++];
    }
    eingabe1[i] = '\0';
    printf("Nach Verketten: ");
    puts(eingabe1);

}

5 个答案:

答案 0 :(得分:1)

您必须在复制字符串时过滤掉空格。

您有两个字符串索引,第一个字符串为i,第二个字符串为j。如果您使用i作为读取位置(随后是两个字符串;您可以在独立循环中“重用”循环计数器)而使用j作为写入位置,则可以更好地利用这些索引。

这是怎么回事。请注意,如果字符串中有空格,代码会尝试通过仅添加字符来防止缓冲区溢出。只有在复制第二个字符串时才需要进行此检查,因为j <= i处理第一个字符串时。

#include <stdio.h>

int main()
{
    char str1[100] = "The quick brown fox jumps over ";
    char str2[100] = "my big sphinx of quartz";

    int i = 0;
    int j = 0;

    while (str1[i] != '\0') {
        if (str1[i] != ' ') str1[j++] = str1[i];
        i++;
    }

    i = 0;
    while (str2[i] != '\0') {
        if (str2[i] != ' ' && j + 1 < sizeof(str1)) str1[j++] = str2[i];
        i++;
    }

    str1[j] = '\0';

    printf("'%s'\n", str1);

    return 0;
}

答案 1 :(得分:1)

除了避免两个单词之间的空格之外,您还必须避免用户在输入缓冲区中放置换行符'\n')字符按输入。在阅读fgets() NOT gets()后的行后,您可以通过简单的测试完成此操作。 gets()不再是标准C库的一部分,由于不安全原因,不应使用它。 Plus fgets提供了对用户可以随时输入的字符数的简单长度控制。

下面,当您阅读eingabe1时遇到麻烦。阅读完毕后,eingabe1在其末尾包含'\n'个字符。 (因为它会使用任何面向行的输入函数(例如getline()fgets()等)来处理换行符,你可以简单地比较它的长度减去{{ 1}}在你遍历字符串后找到 nul 字符。例如:

'1'

通过简单地减少索引if (eingabe1[i-1] == '\n') i--; /* remove trailing '\n', update i */ ,这将保证与'i'的连接在单词之间不会有任何空格或换行符字符。

将各个部分组合在一起,并使用eingabe2代替不安全的fgets,在gets之后使用常量以防止对数组索引进行硬编码,您可能会出现类似于:

#define MAX 100

<强>输出

#include <stdio.h>

#define MAX 100

int main (void)
{
    char eingabe1[MAX] = {0};
    char eingabe2[MAX] = {0};
    int i = 0;
    int j = 0;

    printf("Gib zwei Wörter ein, die aneinander angehängt werden sollen\n");
    printf("1. Zeichenkette: ");
    /* do NOT use gets - it is no longer part of the C library */
    fgets(eingabe1, MAX, stdin);

    putchar ('\n');
    printf("2. Zeichenkette: ");
    /* do NOT use gets - it is no longer part of the C library */
    fgets(eingabe2, MAX, stdin);
    putchar ('\n');

    while (eingabe1[i]) i++;  /* set i (index) to terminating nul  */
    if (i > 0) {
        if (eingabe1[i-1] == '\n') i--;    /* remove trailing '\n' */
        while (i && eingabe1[i-1] == ' ')  /* remove trailing  ' ' */
            i--;
    }

    while (eingabe2[j]) {     /* concatenate string - no spaces    */
        eingabe1[i++] = eingabe2[j++];
    }
    eingabe1[i] = 0;         /* nul-terminate eingabe1 */

    printf("Nach Verketten: %s\n", eingabe1);

    return 0;
}

如果您有任何其他问题,请与我们联系。我已通过上述评论突出显示了这些变化。

答案 2 :(得分:0)

/**
    return: the new len of the string;
*/
int removeChar(char* string, char c) {

    int i, j;
    int len = strlen(string)+1;             // +1 to include '\0'

    for(i = 0, j = 0 ; i < len ; i++){
        if( string[i] == c )
            continue;                       // avoid incrementing j and copying c
        string[ j ] = string[ i ];          // shift characters
        j++;
    }

    return j-1;   // do not count '\0';
}

int main(){

    char str1[] =       "sky is flat ";
    char str2[100] =    "earth is small ";

    strcat( str2, str1 );
    printf("with spaces:\n\t'%s'\n", str2) ;
    removeChar(str2, ' ');

    printf("without spaces:\n\t'%s'\n", str2 );

}


/**
    BONUS: this will remove many characters at once, eg "\n \r\t"
    return: the new len of the string;
*/
int removeChars(char* string, char *chars) {

    int i, j;
    int len = strlen(string); 

    for(i = 0, j = 0 ; i < len ; i++){
        if( strchr(chars,string[i]) )
            continue;                       // avoid incrementing j and copying c
        string[ j ] = string[ i ];          // shift characters
        j++;
    }
    string[ j ]=0;
    return j;   
}

答案 3 :(得分:0)

感谢大家的所有答案。 我现在得到了解决方案。

我从你那里读到了一些建议,并会努力记住未来。

请参阅以下代码: (请原谅我对变量的奇怪名称,我使用德语单词)

一些通知: 我不被允许使用库函数 作为实习生,我不允许出于某些原因使用fgets

#include <stdio.h>

void main()
{
    char eingabe1[100];
    char eingabe2[100];
    int i = 0;
    int j = 0;
    printf("gib zwei wörter ein, die aneinander angehängt werden sollen\n");
    printf("1. zeichenkette: ");
    gets(eingabe1);
    printf("\n");
    printf("2. zeichenkette: ");
    gets(eingabe2);
    printf("\n");

    //Attach Strings
    while (eingabe1[i] != '\0')
    {
        i++;
    }
    while (eingabe2[j] != '\0')
    {
        eingabe1[i++] = eingabe2[j++];
    }

    //Remove Space

    eingabe1[i] = '\0';
    i = 0;
    j = 0;
    while (eingabe1[i] != '\0')
    {
        if (eingabe1[i] != 32)
        {
            eingabe2[j++] = eingabe1[i];
        }
        i++;
    }
    eingabe2[j] = '\0';
    printf("Nach verketten: ");
    puts(eingabe2);

}

答案 4 :(得分:0)

听起来像是家庭作业。

我只想提一下,这些天你可能不应该在字符串上使用sizeof(),因为那里可能有多字节字符。请改用strlen()。 sizeof()唯一合适的时间是你要去malloc()一定数量的字节来存储它。

我经常写一些小循环来做一次一个字符的低级文本,只要知道C中的字符串通常最后有一个0字节。你必须要遇到一个,并确保你在输出上放一个。空格为0x20或十进制32或&#39; &#39;,它只是另一个角色。