C 消除字符串的特殊字符会在空格处停止

C 消除字符串的特殊字符会在空格处停止,c,strlen,C,Strlen,我是C语言的初学者,但我正在尝试制作一个脚本,它可以读取输入,忽略特殊字符和空格,无论字母是否构成回文,都会输出输入的相反内容 我已经尝试在fix函数中调整循环的长度,因为我认为这就是问题所在,但从我可以看出,strlen()按预期工作,循环遇到空格时刚好停止 #include <stdio.h> #include <string.h> #include <ctype.h> #define MAX 1000 /* The maximum number of

我是C语言的初学者,但我正在尝试制作一个脚本,它可以读取输入,忽略特殊字符和空格,无论字母是否构成回文,都会输出输入的相反内容

我已经尝试在fix函数中调整循环的长度,因为我认为这就是问题所在,但从我可以看出,strlen()按预期工作,循环遇到空格时刚好停止

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

#define MAX 1000 /* The maximum number of characters in a line of  
input 
*/
void fix(char str[], char str2[]);
int main()
{
  char text[MAX], text2[MAX], text3[MAX], text4[MAX], temp;
  int i, j;
  int length;

  puts("Type some text (then ENTER):");

  /* Save typed characters in text[]: */

  fgets(text, MAX, stdin);
  length = strlen(text) - 1;

  strcpy(text2, text);

  i = 0;
  j = length-1;
  while(i < j){
        temp = text[i];
        text[i] = text[j];
        text[j] = temp;
        i++;
        j--;
  }
  /* Analyse contents of text[]: */
  printf("Your input in reverse is:\n");
  printf("%s", text);

  fix(text, text3);
  printf("%s\n", text3);
  fix(text2, text4);
  printf("%s\n", text4);
  if(strcmp(text4, text3) == 0)
        printf("Found a palindrome!\n");
return 0;
}


void fix(char str[], char str2[]){
  int i;
  for(i = 0; i < strlen(str)-1; i+=1){
        if (isalpha(str[i])){
                str2[i] = tolower(str[i]);
        }
  }
}
#包括
#包括
#包括
#定义MAX 1000/*字符行中的最大字符数
输入
*/
无效修复(char str[],char str2[]);
int main()
{
字符文本[MAX],文本2[MAX],文本3[MAX],文本4[MAX],温度;
int i,j;
整数长度;
puts(“键入一些文本(然后输入):”;
/*在文本[]中保存键入的字符:*/
fgets(文本、最大值、标准输入);
长度=strlen(文本)-1;
strcpy(text2,text);
i=0;
j=长度-1;
而(i
对于“护士,运行”的输入,反向字符串正确输出,但没有“找到回文!”

打印文本3和文本4分别打印“护士”和“护士”


循环似乎在遇到空格时停止,但我不知道为什么,因为它应该根据完整输入的长度来执行。

您的
fix
函数中存在一个问题,导致未定义的行为,因为您只初始化结果字符串中的字母字符位置

因为您的要求是忽略非字母字符,所以需要一个额外的计数器。显然,如果必须从字符串中删除字符,
i
将指向错误的字符。因此,您需要计算实际复制到str2的字符数

void fix(char str[], char str2[])
{
    int i, copied = 0;
    for(i= 0; str[i] != '\0'; i++)              // See note 1
    {
        if (isalpha(str[i])) {
            str2[copied++] = tolower(str[i]);   // See note 2
        }
    }
    str2[copied] = '\0';                        // See note 3
}
注:

  • 无需在每次测试中调用
    strlen
    。事实上,您根本不需要调用它——这只是测试字符串的null终止符
  • 请注意,
    copied
    在这里递增。这保证了排除字符时不会出现间隙
  • 您必须记住以null结束新字符串

  • 好的,这很有意义,我甚至没有意识到我会跳过新字符串中的空格,因为我在第一个字符串中发现了一个非字母顺序的字符串,所以谢谢你。另外,当调用str2[copied++]时,第一次调用它时,copied是否仍然等于0?看起来它等于1。读这篇文章:酷,以前从没听说过,奇怪的是。谢谢大多数关于C的介绍性书籍都很早就解释了这一点。明白了,我最近刚在课堂上学了一些C,老实说,我没有为此做太多的阅读哈哈。再次感谢!