You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C代码用strcmp判断字符串首字符时出现-Wint-conversion警告的求助

C语言代码问题:筛选以特定字符开头的字符串

原代码

#include <stdio.h>
#include <string.h>
int main ()
{
    int i, containizioa,lenstringa;
    char stringa[20], stringhemin3[20], strG[30];
    containizioa = 0;
    for (i = 0; i < 7; i++)
    {
        printf("Inserisci una stringa\n");
        scanf("%s", stringa);
        if (strcmp(stringa[0], "a"))
        {
            containizioa++;
        }
        lenstringa = strlen(stringa);
        if (lenstringa <= 3)
        {
           strcat(stringhemin3, " ");
           strcat(stringhemin3, stringa);
        }
        if (strcmp(stringa[0], "g"))
        {
            strcat(strG, "_");
            strcat(strG, stringa);
        }
        
    }
    printf("Le stringhe di lunghezza inferiore o uguale a 3 sono: %s\n",stringhemin3);
    printf("Il numero di stringhe che iniziano per a è: %d\n", containizioa);
    printf("Le stringhe che iniziano per g sono: %s", strG);
  return 0;
}

编译警告

warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast [-Wint-conversion]

问题描述

尝试去掉[0]后,代码会统计所有包含'g'的字符串;替换为[1]也出现同样问题,请问该如何解决?


解决方案

1. 修复字符比较的错误

strcmp是用来比较两个字符串的函数,参数必须是char*类型的指针,但stringa[0]是单个字符(char类型),类型不匹配才会触发编译警告。要判断字符串首字符是否为'a'或'g',直接用字符相等比较即可,注意用单引号包裹字符常量:

  • 把if (strcmp(stringa[0], "a"))改为if (stringa[0] == 'a')
  • 把if (strcmp(stringa[0], "g"))改为if (stringa[0] == 'g')

另外要注意:原代码中strcmp的逻辑是反的——strcmp返回0表示两个字符串相等,原来的if(strcmp(...))会在字符不相等时执行代码,和你统计以'a'/'g'开头的意图完全相反,这也是隐藏的逻辑错误。

2. 初始化目标字符串

stringhemin3和strG定义后未初始化,直接调用strcat会导致未定义行为(strcat需要目标字符串以'\0'结尾才能找到正确的拼接位置)。定义时直接初始化为空字符串:

char stringa[20], stringhemin3[20] = "", strG[30] = "";

3. 避免输入溢出

scanf("%s", stringa)如果输入超过19个字符(数组长度20,需留一个位置存'\0')会导致缓冲区溢出,建议限制输入长度:

scanf("%19s", stringa);

修复后的完整代码

#include <stdio.h>
#include <string.h>
int main ()
{
    int i, containizioa, lenstringa;
    char stringa[20], stringhemin3[20] = "", strG[30] = "";
    containizioa = 0;
    for (i = 0; i < 7; i++)
    {
        printf("Inserisci una stringa\n");
        scanf("%19s", stringa);
        // 统计以'a'开头的字符串
        if (stringa[0] == 'a')
        {
            containizioa++;
        }
        lenstringa = strlen(stringa);
        if (lenstringa <= 3)
        {
           strcat(stringhemin3, " ");
           strcat(stringhemin3, stringa);
        }
        // 拼接以'g'开头的字符串
        if (stringa[0] == 'g')
        {
            strcat(strG, "_");
            strcat(strG, stringa);
        }
        
    }
    printf("Le stringhe di lunghezza inferiore o uguale a 3 sono: %s\n", stringhemin3);
    printf("Il numero di stringhe che iniziano per a è: %d\n", containizioa);
    printf("Le stringhe che iniziano per g sono: %s\n", strG);
    return 0;
}

内容的提问来源于stack exchange,提问作者Vitaliano17

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:34:58