2016-10-22 70 views
0

我的程序旨在制作一个名词的复数。错误来自行"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; 
} 
+0

你的意思是:'char * pstr =&userNoun [lengthStr - 1];' – tapananand

+1

'userNoun [lengthStr - 1]'是一个'char'。如果你想要一个指向字符地址的指针,你应该直接执行'&(userNoun [lengthStr - 1])'或用户指针算术。 – Jameson

回答

1

您有两个错误:

  • 所述一个引起问题是缺少地址的operatorin userNoun [lengthStr-1]表达
  • 第二个问题是的 “ES” 的大小数组:一个[2]是太小,放不下后“ES”空终结,所以你最终会得到未定义行为

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

+0

还有一些错误:输入缓冲区太小,引用文本字符串“不超过25个字符”,并且scanf的格式字符串没有上限。对输入也没有检查,例如,一个空字符串(用户按Enter键)将导致数组索引超出界限[lenghtStr - 1] –

0

你指出你的问题的错误意味着你正在尝试与userNoun[lengthStr - 1]的价值,这是一个char值(而不是char指针)

编译器的消息可能听起来初始化指针变量char *pstr不精确,但它是。 char值被视为一个数字,目标类型不是。