从 C 中的字符串中读取元素

Reading elements from a string in C

我正在尝试在用户输入的位置打印单词的第一个字母。如果有空格,那么它将停止搜索。 有一条关于功能gets()的温馨信息。我的指针和函数有问题,它只是 return 字母 没有。我认为问题可能出在 while 循环上。函数 firstLetter 打印单词的第一个字母。例如,如果用户输入先前输入的字符串的索引 5,并且在 str[5] 中对应于单词 'ice-cream' 的 'e',那么 firstLetter 将搜索第一个字母这个词,在这种情况下它将 return 'i'.

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


int firstLetter(int , char *);

int main()
{
    char str[200];
    printf("Insert line: ");
    gets(str);
    
    int pstn;
    scanf("%i,&pstn");
    
    firstLetter(pstn, str);
    
    
    return 0;
}

int firstLetter(int i, char *str)
{
    if(str[i]=' ')
    {
        printf("No letters at this position");
    }
    
    else
    {
        while(str[i]!=' ')
        {
            i--;
        }
        printf("First letter: %c ",str[i+1]);
    }
    return 0;
}

对于这一行的初学者

scanf("%i,&pstn");

你打错了。至少你需要像

那样重写它
scanf("%i",&pstn);

同样在函数 firstLetter 的 if 语句中也有错别字

if(str[i]=' ')

您使用赋值运算符 = 而不是比较运算符 ==

函数 gets 不安全且不受 C 标准支持。

而是使用函数 fgets

fgets( str, sizeof( str ), stdin );

变量pstn应该是无符号整数类型size_t。否则用户可以输入负数。

还需要检查输入的位置是否大于字符串的长度。

例如

size_t pstn = 0;
scanf("%zu", &pstn);

if ( pstn < strlen( str ) ) firstLetter(pstn, str);

函数参数应具有限定符 const,因为传递的字符串在函数内不会更改

这个函数也有一个错误,因为在这个 while 循环中

    while(str[i]!=' ')
    {
        i--;
    }

不检查 i 是否小于 0

还有函数的return类型int也没用

函数可以通过以下方式声明和定义

void firstLetter( const char *str, size_t i )
{
    if ( str[i] == ' ' )
    {
        printf("No letters at this position");
    }
    else
    {
        while( i != 0 && str[i-1] != ' ' )
        {
            i--;
        }

        printf("First letter: %c\n", str[i] );
    }
}

所以在 main 中函数被调用为

size_t pstn = 0;
scanf("%zu", &pstn);

if ( pstn < strlen( str ) ) firstLetter( str, pstn );

或者你可以在函数中检查字符串中的指定位置是否小于字符串的长度,例如

void firstLetter( const char *str, size_t i )
{
    if ( !( i < strlen( str ) ) || str[i] == ' ' )
    {
        printf("No letters at this position");
    }
    else
    {
        while( i != 0 && str[i-1] != ' ' )
        {
            i--;
        }

        printf("First letter: %c\n", str[i] );
    }
}

在这种情况下函数被调用为

size_t pstn = 0;
scanf("%zu", &pstn);

firstLetter( str, pstn );

您可以使用标准与 space 字符 ' ' 和制表符 '\t' 进行比较,而不是与 space 字符 ' ' 进行比较C 函数isblank 在header <ctype.h> 中声明。例如

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

void firstLetter( const char *str, size_t i )
{
    if ( !( i < strlen( str ) ) || isblank( ( unsigned char )str[i] ) )
    {
        printf("No letters at this position");
    }
    else
    {
        while( i != 0 && !isblank( ( unsigned char )str[i-1] ) )
        {
            i--;
        }

        printf("First letter: %c\n", str[i] );
    }
}