c - 初始化从整数创建指针而不进行强制转换

标签 c

我的程序旨在生成名词的复数形式。该错误来自行 "char *pstr = userNoun[lengthStr - 1];" 。有人能告诉我我的错误是什么吗?

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

void pluralNoun(char userNoun[27]){
    int lengthStr = 0;
    const char caseOne[2] = "es";
    const char caseTwo[2] = "s";
    lengthStr = strlen(userNoun);
    char *pstr = userNoun[lengthStr - 1];

    if(strncmp(pstr - 1, "ch", 2) == 0){
        strcat(userNoun, caseOne);
    }
    else if(strncmp(pstr - 1, "sh", 2) == 0){
        strcat(userNoun, caseOne);
    }
    else if(*pstr == 's'){
        strcat(userNoun, caseOne);
    }
    else if(*pstr == 'y'){
        userNoun[lengthStr - 1] = 'i';
        strcat(userNoun, caseOne);
    }
    else {
        strcat(userNoun, caseTwo);
    }
    printf("The plural of your noun is %s\n", userNoun);
}

int main(void){
    char userVar[25];

    printf("Enter a noun no more than 25 characters in length in lower case letters:\n");
    scanf("%s", userVar);
    pluralNoun(userVar);

    return 0;
}

最佳答案

您有两个错误:

  • 导致问题的原因是 userNoun[lengthStr-1] 表达式中缺少地址运算符
  • 第二个问题是“es”数组的大小:one[2] 太小,无法容纳“es”后面的空终止符,因此最终会出现未定义的行为

由于 strcat 不会重新分配,请确保缓冲区有足够的空间容纳附加后缀和 null 终止符。

关于c - 初始化从整数创建指针而不进行强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40196548/

相关文章:

c - 如何正确地将 unsigned char 数组转换为 uint32_t

c++ - 集合类型的可变长度参数列表

c - 自习室预约计划

c - 存储负数

c - fgetc 总是返回值 1

c - 如何在 32 位单片机上执行得比 "snprintf(mystr, 22, "{%+0.4f,%+0.4f }", (double)3.14159265, (double) 2.718281828459);"更快

c - 带有通用文件的多个可执行文件的 Makefile

c - C中是否有一个函数可以检查一个字符是字符还是整数等?

c - 从 (void *) 类型取消引用结构

c - 显示最少/最常出现的字符的程序