【问题标题】:in C, I'm looking for a simple solution for my code that works until a word with 8 or more letters is entered在 C 中,我正在为我的代码寻找一个简单的解决方案,该解决方案在输入一个包含 8 个或更多字母的单词之前一直有效
【发布时间】:2018-10-23 01:27:39
【问题描述】:

我对 C 语言比较陌生,我正在尝试使用此代码反转一个字符串,并且它一直有效,直到输入一个包含 8 个或更多字母的单词,我不太明白为什么。

int main()
{
  char string[50], newString[50];
  int end, x;

  printf("Enter a string: \n");
  scanf("%50s", string);

  end = strlen(string);

  printf("%d\n", end);

  for(x=0; x < end; x++){
      newString[(end - 1) - x] = string[x];
  }

printf("%s", newString);
}

这个问题的措辞有点奇怪,但它不会让我问这个问题,因为“我的标题与提出的其他问题太相似了”,即使我已经看过并且没有找到我想知道的内容。

【问题讨论】:

  • 你好,你想改变你的语句 newString[(end-1)-x] = string[x];到 newString[x] = string[end-1-x] 。其次,正如我所见,除了50之外应该没有长度限制,你确定不是因为你使用的是带空格的字符串吗?
  • 试过了,这并没有什么不同,我的代码仍然不适用于大于 7 个字母的单词。是的,我的输入词是“abi​​gword”,没有空格。
  • 您是否尝试过将 newString 初始化为所有 NULL 或以其他方式将 NULL 附加到 newString 的末尾?
  • 这是否可行?我会尝试,但如果代码适用于 4 个字母的单词,例如“test”,为什么对于大于 7 个字母的单词需要进行此更改。编辑:好的,刚刚测试了这个,它现在可以工作了,虽然还不清楚为什么,但无论如何谢谢。
  • scanf("%50s", string); 为大于或等于50 字符的字符串在字符串数组的末尾写入一个。 scanf 需要 'n-1' 作为 "%s" 转换说明符的 field-width 修饰符。 (在遇到第一个空格时停止阅读)。使用fgets() 而不是scanf...(并且至少检查返回以了解您使用的任何功能)

标签: c arrays


【解决方案1】:

您尚未在 newString 缓冲区的末尾添加 NULL 终止符。尝试在循环之后和打印之前添加这一行。

newString[end] = '\0';

根据运行时在newString 缓冲区中放置的内容,您按原样编写代码会产生随机结果。如果幸运的话,在正确的位置会有一个 NULL 终止符,但看起来你对短字符串很不走运。

【讨论】:

  • 这会惨遭失败,并带有诸如“这根本行不通”之类的字符串。
  • 是的。 OP 的 scanf 仅适用于单个字符串。因此,如果指定的输入允许输入中的空格或其他特殊字符,他将需要更复杂的机制来读取字符串。
【解决方案2】:

bruceg 所说的应该可以,但一般来说,您应该养成初始化您使用的变量的习惯。

char string[50] = {0};  //declare and initialize to zero all elements before it is used.
char newString[50] = {0};
int x = 0;
int end = 0;

这样,当你复制到 newString 时,你知道 newString[i] 为 0,复制完成后 %s 将命中空终止符。

【讨论】:

    【解决方案3】:

    在 C 中,我正在为我的代码寻找一个简单的解决方案,直到 输入了 8 个或更多字母的单词

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX 15
    void trim_newline(char str[]);
    
    int main()
    {
        char s[MAX + 1] = "";
    
        printf("Enter string: ");
        fgets(s, MAX, stdin);
        trim_newline(s);
        if (strlen(s) >=8)
        {
            printf("Len >= 8\n");
            printf("Quitting ...\n");
        }
        else
        {
            printf("s = %s\n", s);
            printf("Length of s = %d\n", (int)strlen(s));
            printf("Reversed s = %s\n", strrev(s));
        }
    
        return EXIT_SUCCESS;
    }
    // -----------------------
    void trim_newline(char str[])
    {
        if(str[strlen(str) -1] == '\n')
            str[strlen(str) - 1] = '\0';
    }
    

    strrev() 反转字符串。不需要重做,除非你的老师特别要求。 fgets() 是获取字符串的安全方法。如果找到换行符,则必须对其进行修剪。您可以自己添加关于零长度的条件(用户只能按 Enter)。

    【讨论】:

    • 好的,我将您的代码完全复制到我的 C 工作区并得到“错误:函数‘strrev’的隐式声明;你的意思是‘strlen’吗?”
    • 或者你使用了#include (如果你在windows上)?一般来说,说明您的工作区是如何配置的会很有帮助。
    • 我确实使用过 #include 并在 Mac 上使用。反正这不是什么大不了的事,因为我自己知道怎么做,但无论如何感谢您的帮助
    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2022-08-15
    相关资源
    最近更新 更多