【问题标题】:Spaces shouldn't be counted to string length空格不应计入字符串长度
【发布时间】:2018-12-05 14:53:19
【问题描述】:

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

我如何对这段代码进行编程,使其不计入空间长度?

甚至可以在使用 fgets 的同时实现它吗?

提前谢谢你。

#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;
  }

【问题讨论】:

  • 你可以先去掉空格吗?
  • 但我还是想打印出来
  • 你可以计算空格然后从长度中减去?
  • 那你需要一个单独的循环来统计空格的个数,并在key的计算中减去它。
  • 顺便说一下,array[i] + key 可能会导致算术溢出。并且取决于类型char 是有符号还是无符号(由实现定义),这可能导致未定义的行为。它还可能导致 array[i] 的值变得无法打印。

标签: c arrays string loops


【解决方案1】:

1)如果不想在key的计算中包含空格,就得自己制作函数来计算空格的个数。

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

3) 执行key % 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;
  }

例子:

input:  a b c
len = 5
spaces = 2
key = 1
b c d

【讨论】:

  • 如果您要遍历字符串中的每个字符以检查每个字符是否为空格,为什么还要调用strlen
  • 谢谢我已经尝试过了,但是如果我将数组大小增加到 100 并且输入有 26 个字符,它会将空格计为一个字符。所以长度是 27。我一直在尝试修复它,但找不到解决方案
  • @TimRandall 打印结果的循环仍然需要包含空格的长度。代码可能会被重写以获得更好的性能,但我更喜欢让它尽可能接近 OP 的原始代码。
  • @momonosuke 在您观察到的情况下,确切的输入是什么?
  • 这个caeserwas 不是很安全。当我输入这个时,我得到不可打印的字符
猜你喜欢
  • 2013-05-12
  • 2022-01-15
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多