C 空格';不能计入字符串长度

C 空格';不能计入字符串长度,c,arrays,string,loops,C,Arrays,String,Loops,此代码获取用户输入,然后使用长度为256%的字符串。如果结果为3,输入为abc,则输出为bcd。这个很好用。但是,如果输入是例如“hey whatsup”,那么长度是11,应该是10,因为长度中不应包含空格 我如何编程这段代码,使它不计算空间的长度 甚至可以在使用FGET时实现它吗 先谢谢你 #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char

此代码获取用户输入,然后使用长度为256%的字符串。如果结果为3,输入为abc,则输出为bcd。这个很好用。但是,如果输入是例如“hey whatsup”,那么长度是11,应该是10,因为长度中不应包含空格

我如何编程这段代码,使它不计算空间的长度

甚至可以在使用FGET时实现它吗

先谢谢你

#include <stdio.h>
#include <string.h> 
#include <stdlib.h>

  int main() {

    char array[20];
    int length = 0;
    int i;
    int key = 256;

    printf("input:  ");

    fgets(array, 20, stdin);

    length = strlen(array) - 1;

    key = key % length;

    if (key > 0) {

      for (i = 0; i < length; i++) {

        if (array[i] == ' ') {

          printf("%c", array[i]);

          continue;

        }
        array[i] = array[i] + key;

        printf("%c", array[i]);
      }

    }

    return 0;
  }
#包括
#包括
#包括
int main(){
字符数组[20];
整数长度=0;
int i;
int键=256;
printf(“输入:”);
fgets(阵列,20,标准输入);
长度=strlen(数组)-1;
key=key%长度;
如果(键>0){
对于(i=0;i
1)如果不想在计算密钥时包含空格,则必须使用自己的函数来计算空格数

2) 代码
length=strlen(数组)-1
似乎“注意”字符串末尾的
'\n'
。但是,您不能确定是否存在
'\n'
。你需要先检查一下

3) 执行
键%0
将是“错误”的,因此也要检查一下

代码可能类似于:

#include <stdio.h>
#include <string.h> 
#include <stdlib.h>

int cnt_spaces(char* arr)
{
    int res = 0;
    while(*arr)
    {
        if (*arr == ' ')
        {
            ++res;
        }
        ++arr;
    }
    return res;
}

int main() {
    char array[20];
    int length = 0;
    int i;
    int key = 256;

    printf("input:  ");

    fgets(array, 20, stdin);
    length = strlen(array);
    if (strlen(array) == 0) return 0;  // or add error handling

    // Remove \n if present
    if (array[length-1] == '\n')
    {
        array[length-1] = '\0';
        --length;
    }
    printf("len = %d\n", length);

    int spaces = cnt_spaces(array);
    printf("spaces = %d\n", spaces);

    if (length == spaces) return 0;  // or add error handling
    key = key % (length - spaces);

    printf("key = %d\n", key);

    if (key > 0) {
        for (i = 0; i < length; i++) {
            if (array[i] != ' ') {
                array[i] = array[i] + key;
            }
            printf("%c", array[i]);
        }
    }

    return 0;
  }
1) 如果不想在键的计算中包含空格,则必须使用自己的函数来计算空格数

2) 代码
length=strlen(数组)-1
似乎“注意”字符串末尾的
'\n'
。但是,您不能确定是否存在
'\n'
。你需要先检查一下

3) 执行
键%0
将是“错误”的,因此也要检查一下

代码可能类似于:

#include <stdio.h>
#include <string.h> 
#include <stdlib.h>

int cnt_spaces(char* arr)
{
    int res = 0;
    while(*arr)
    {
        if (*arr == ' ')
        {
            ++res;
        }
        ++arr;
    }
    return res;
}

int main() {
    char array[20];
    int length = 0;
    int i;
    int key = 256;

    printf("input:  ");

    fgets(array, 20, stdin);
    length = strlen(array);
    if (strlen(array) == 0) return 0;  // or add error handling

    // Remove \n if present
    if (array[length-1] == '\n')
    {
        array[length-1] = '\0';
        --length;
    }
    printf("len = %d\n", length);

    int spaces = cnt_spaces(array);
    printf("spaces = %d\n", spaces);

    if (length == spaces) return 0;  // or add error handling
    key = key % (length - spaces);

    printf("key = %d\n", key);

    if (key > 0) {
        for (i = 0; i < length; i++) {
            if (array[i] != ' ') {
                array[i] = array[i] + key;
            }
            printf("%c", array[i]);
        }
    }

    return 0;
  }


你可以先去掉空格?但我还是想打印出来。你可以先计算空格,然后从长度中减去。然后你需要一个单独的循环来计算空格数,然后在计算
key
时减去它。顺便说一句,
array[I]+key
可能会导致算术溢出。并且取决于类型
char
是有符号的还是无符号的(由实现定义),这可能导致未定义的行为。这也可能导致
array[i]
的值无法打印。您可以先去掉空格?但我仍然想打印它们。您可以计算空格,然后从长度中减去空格?然后您需要一个单独的循环来计算空格数,并在计算
键时减去空格。顺便说一下,
array[i]+键
可能导致算术溢出。并且取决于类型
char
是有符号的还是无符号的(由实现定义),这可能导致未定义的行为。它还可能导致
array[i]
的值无法打印。如果要遍历字符串中的每个字符,检查每个字符是否都是空格,为什么还要调用strlen呢?谢谢,我已经尝试过了,但是如果我将数组大小增加到100,并且输入有26个字符,那么它会将空格计算为一个字符。所以长度是27。我一直在试图修复它,但找不到正确的方法solution@TimRandall打印结果的循环仍然需要包含空格的长度。代码可能会被重写以获得更好的性能,但我更愿意让它尽可能接近OPs原始代码。@momonosuke在您观察到的情况下,确切的输入是什么?不能完全解决此问题。当我输入这个时,我得到了无法打印的字符如果你要遍历字符串中的每个字符,检查每个字符是否都是一个空格,为什么还要调用
strlen
?感谢我尝试过它,它可以工作,但是如果我将数组大小增加到100,并且输入有26个字符,那么将空格作为一个字符计数。所以长度是27。我一直在试图修复它,但找不到正确的方法solution@TimRandall打印结果的循环仍然需要包含空格的长度。代码可能会被重写以获得更好的性能,但我更愿意让它尽可能接近OPs原始代码。@momonosuke在您观察到的情况下,确切的输入是什么?不能完全解决此问题。当我输入这个时,会得到无法打印的字符