【问题标题】:strlen gives segmentation fault in loop [closed]strlen 在循环中给出分段错误[关闭]
【发布时间】:2019-08-07 16:57:40
【问题描述】:

关于hackerrank问题,我需要获取字符串中元素的数量, 如何在不给出分段错误的情况下让 strlen 工作

已经搜索并得到了类似的结果,包括告诉放置“\0” 在字符串的末尾,但不知道它是如何工作的

int main() {

    int n,c;
    char s[1024];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s", s);
        c=strlen(s);
        for(int j=0;j<c;j+=2)
        {
            printf("%s",s[j]);
        }
        printf(" ");
        for(int k=1;k<c;k+=2)
        {
            printf("%s",s[k]);
        }

    }


    return 0;
}

请解释我如何使用 strlen 或任何其他替代方法,如 isspace 或代码来计算字符

【问题讨论】:

  • 不是 strlen 给出了分段错误。使用 printf("%s",&s[j]);和 printf("%s",&s[k]) 或 printf("%s",s + j);和 printf("%s",s + k);如果您只想输出一个字符,请使用格式说明符 %c。例如 printf("%c",s[j]);
  • 我建议不要使用 scanf() 从标准输入读取字符串。相反,最好使用fgets()
  • 这应该是scanf("%1023s", s);
  • scanf 是你需要尽快停止使用的拐杖。我在这里看到了太多的 C 代码 sn-ps,问题在于该工具的限制。您还需要注意返回码。 scanf 可以返回一个错误条件,你完全忽略它。您还应该在打开所有警告的情况下进行编译,-Wall,以了解您可能不知道的任何潜在问题。
  • @tadman 它的错误返回是 0,以防有人想知道。这意味着没有匹配的格式说明符。

标签: c segmentation-fault strlen


【解决方案1】:

这两行:

printf("%s",s[j]);
...
printf("%s",s[k]);

将字符打印为字符串。相反,请这样做:

printf("%c",s[j]);
...
printf("%c",s[k]);

另外,为避免缓冲区溢出,您应该这样做:

scanf("%1023s", s);

而不是这个:

scanf("%s", s);

带有修复的完整代码(包括将main 声明为int main(void)):

int main(void) {
    int n,c;
    char s[1024];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%1023s", s);
        c=strlen(s);
        for(int j=0;j<c;j+=2)
        {
            printf("%s", &s[j]);
        }
        printf(" ");
        for(int k=1;k<c;k+=2)
        {
            printf("%s", &s[k]);
        }

    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2023-04-08
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多