在C语言中计算字符串中合适的首字母

在C语言中计算字符串中合适的首字母,c,string,C,String,请帮我完成这部分功能。在这个函数中,我创建了一个for循环,用来计算字符串中每个单词开头的合适字母。例如,如果我将字符串Beautiful skies传递到函数和char's',则在For循环之后,变量count必须等于1,但它不会发生。有什么问题吗?我在编码方面是个新手,但这一个看起来很适合我,但出于某种原因,这个for循环没有像我预期的那样工作,这只是整个函数的一部分,但问题出在for循环中,因为它总是返回NULL,即使有一些合适的字母: char** rearrange_string(ch

请帮我完成这部分功能。在这个函数中,我创建了一个for循环,用来计算字符串中每个单词开头的合适字母。例如,如果我将字符串Beautiful skies传递到函数和char's',则在For循环之后,变量count必须等于1,但它不会发生。有什么问题吗?我在编码方面是个新手,但这一个看起来很适合我,但出于某种原因,这个for循环没有像我预期的那样工作,这只是整个函数的一部分,但问题出在for循环中,因为它总是返回NULL,即使有一些合适的字母:

char** rearrange_string(char *str, char letter, int *size) 
{
    char *search, **array, upper_letter = toupper(letter), *shift;
    int count = 0, i=0, j=0, counter;
    for (search = str; *search != '\0'; search++) {
        if (*search == ' ') {
            continue;
        }
        if (*search != letter || *search != upper_letter) {
            while (*search != ' ') {
                search++;
                if (*search == '\0') {
                    break;
                }
            }
            continue;
        }
        if (*search == letter || *search == upper_letter) {
            count++;
            while (*search != ' ') {
                search++;
                if (*search == '\0') {
                    break;
                }
            }
        }
    }
    if (count == 0) {
        printf("There is no suitable data. Please reinput the string.");
    return NULL;
}
如果字母为,则始终为真!=大写字母

将其更改为:

*search != letter && *search != upper_letter

当使用字符串运行时,程序会出现缓冲区溢出,因为搜索超出了原始字符串。在*search==字母的情况下,递增search直到*search==0,然后在循环结束时再次递增search,因此它超出了分配的缓冲区

以下分析表明:


像这样的函数呢

#include <unistd.h>
#include <stdio.h>

size_t   count_char(char *str, char s)
{
    size_t  count = 0;

    for (size_t i = 0; str[i]; i++)
         if (str[i] == s)
             count += 1;
    return (count);
}
此代码只返回字符串中的字符数,如:

printf%li\n,count_char美丽的天空's'

将打印:

一,


谢谢大家!问题出在for循环的第一个if语句中。我应该把&&而不是| |。非常感谢。如果有人想看到整个程序,下面是完整的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <ctype.h>

char** rearrange_string(char *str, char letter, int *size);

void main()
{
  int size=0, i=0;
  char *str, letter, **array;
  printf("Enter the string and press ENTER to check: ");
  gets(str);
  printf("Enter the character for check (only lower chars!): ");
  scanf("%c", &letter);
  array = rearrange_string(str, letter, &size);
  if (array == NULL)
  {
    printf("\nNo data found, please relaunch the program.");
    return;
  }
  printf("The output string(s) is(are):\n");
  for (i=0; i<size; i++)
  {
    printf("%s", array[i]);
    printf("\n");
  }
  printf("size: %d", size);
  for (i=0; i<size; i++)
  {
    free(array[i]);
  }
  free(array);
}

char** rearrange_string(char *str, char letter, int *size)
{
  char *search, **array, upper_letter = toupper(letter), *shift;
  int count = 0, i=0, j=0, counter;
  for (search = str; *search != '\0'; search++)
  {
    if (*search == ' ')
    {
      continue;
    }
    if (*search != letter && *search != upper_letter)
    {
      while (*search != ' ')
      {
        search++;
        if (*search == '\0')
        {
          break;
        }
      }
      continue;
    }
    if (*search == letter || *search == upper_letter)
    {
      count++;
      while (*search != ' ')
      {
        search++;
        if (*search == '\0')
        {
          break;
        }
      }
    }
  }
  if (count == 0)
  {
    printf("There is no suitable data. Please reinput the string.");
    return NULL;
  }
  *size = count;
  array = (char**)malloc(count*sizeof(char*));
  for (search = str; *search != '\0'; search++)
  {
    if (*search == ' ')
    {
      continue;
    }
    if (*search != letter && *search != upper_letter)
    {
      while (*search != ' ')
      {
        search++;
        if (*search == '\0')
        {
          break;
        }
      }
      continue;
    }
    if (*search == letter || *search == upper_letter)
    {
      counter = 1;
      j=0;
      shift = search;
      while (*search != ' ')
      {
        counter++;
        search++;
        if (*search == '\0')
        {
          break;
        }
      }
      array[i] = (char*)malloc(counter*sizeof(char));
      while (*shift != ' ')
      {
        *(*(array+i)+j) = *shift;
        j++;
        shift++;
        if (*shift == '\0')
        {
          break;
        }
      }
      *(*(array+i)+j) = '\0';
      i++;
    }
  }
  return array;
}

您需要提供一个包含输入、实际和预期输出的列表。请阅读这篇文章。另外,什么是合适的字母?这是学习调试的一个好例子。你试过调试它吗?如果*搜索!=字母| |*搜索!=大写字母{是您的问题。*搜索不能同时与字母和大写字母不同。if*search!=字母{124;}search!=大写字母{…}应该是if*search!=字母&&&*search!=大写字母{…}。此代码对输入str=AABBAA,s='A'抛出警告并返回6
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <ctype.h>

char** rearrange_string(char *str, char letter, int *size);

void main()
{
  int size=0, i=0;
  char *str, letter, **array;
  printf("Enter the string and press ENTER to check: ");
  gets(str);
  printf("Enter the character for check (only lower chars!): ");
  scanf("%c", &letter);
  array = rearrange_string(str, letter, &size);
  if (array == NULL)
  {
    printf("\nNo data found, please relaunch the program.");
    return;
  }
  printf("The output string(s) is(are):\n");
  for (i=0; i<size; i++)
  {
    printf("%s", array[i]);
    printf("\n");
  }
  printf("size: %d", size);
  for (i=0; i<size; i++)
  {
    free(array[i]);
  }
  free(array);
}

char** rearrange_string(char *str, char letter, int *size)
{
  char *search, **array, upper_letter = toupper(letter), *shift;
  int count = 0, i=0, j=0, counter;
  for (search = str; *search != '\0'; search++)
  {
    if (*search == ' ')
    {
      continue;
    }
    if (*search != letter && *search != upper_letter)
    {
      while (*search != ' ')
      {
        search++;
        if (*search == '\0')
        {
          break;
        }
      }
      continue;
    }
    if (*search == letter || *search == upper_letter)
    {
      count++;
      while (*search != ' ')
      {
        search++;
        if (*search == '\0')
        {
          break;
        }
      }
    }
  }
  if (count == 0)
  {
    printf("There is no suitable data. Please reinput the string.");
    return NULL;
  }
  *size = count;
  array = (char**)malloc(count*sizeof(char*));
  for (search = str; *search != '\0'; search++)
  {
    if (*search == ' ')
    {
      continue;
    }
    if (*search != letter && *search != upper_letter)
    {
      while (*search != ' ')
      {
        search++;
        if (*search == '\0')
        {
          break;
        }
      }
      continue;
    }
    if (*search == letter || *search == upper_letter)
    {
      counter = 1;
      j=0;
      shift = search;
      while (*search != ' ')
      {
        counter++;
        search++;
        if (*search == '\0')
        {
          break;
        }
      }
      array[i] = (char*)malloc(counter*sizeof(char));
      while (*shift != ' ')
      {
        *(*(array+i)+j) = *shift;
        j++;
        shift++;
        if (*shift == '\0')
        {
          break;
        }
      }
      *(*(array+i)+j) = '\0';
      i++;
    }
  }
  return array;
}