尝试修复 - C 中的分段错误

Trying to fix - segmentation fault in C

我正在执行一种方法,用“%20”替换字符串中的所有 space。可以假设字符串末尾有足够的 space 来容纳额外的字符,并且给定字符串的 "true" 长度。

示例:

输入:"Mr John Smith "、13

输出:"Mr%20John%20Smith"

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

void URL(char str[], int length)
{

    int spacecount = 0, index;

    for (int i = 0; i < length; i++)
    {
        if (str[i] == ' ')
        {
            spacecount++;
        }
    }
    index = length + spacecount * 2;
    if (length < strlen(str))
        str[length] = '[=10=]';

    for (int j = length - 1; j >= 0; j--)
    {
        if (str[j] == ' ')
        {
            str[index - 1] = '0';
            str[index - 2] = '2';
            str[index - 3] = '%';
            index = index - 3;
        }
        else
        {
            str[index - 1] = str[j];
            index--;
        }
    }
    printf("%s", str);
}

int main()
{
    char str[100];
    int len;
    printf("Enter the string : ");
    scanf("%s", str);
    printf("Enter the length : ");
    scanf("%d", &len);
    URL(str, len);
}

在使用 gcc 编译器执行上述代码时,出现了分段错误。我明白,什么是分段错误。我想在这个程序中修复它。

如何

scanf("%s", str);

工作?

如果您输入以下内容,str 将包含什么内容:Mr John Smith

不是你想的那样!答案是它将包含 Mr,因此您没有长度为 13.

的字符串

改用 fgets 但记得删除换行符。

完整的程序可以是:

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

void URL(char str[], int length)
{
    printf("input: |%s|\n", str);
    int spacecount = 0, index;

    for (int i = 0; i < length; i++)
    {
        if (str[i] == ' ')
        {
            spacecount++;
        }
    }
    index = length + spacecount * 2;
    str[index] = '[=11=]';
    for (int j = length - 1; j >= 0; j--)
    {
        if (str[j] == ' ')
        {
            str[index - 1] = '0';
            str[index - 2] = '2';
            str[index - 3] = '%';
            index = index - 3;
        }
        else
        {
            str[index - 1] = str[j];
            index--;
        }
    }
    printf("output: |%s|\n", str);
}

int main()
{
    char str[100];
    int len;
    printf("Enter the string : ");
    fgets(str, 100, stdin);
    len = strlen(str);
    if (len > 0 && str[len-1] == '\n') str[--len] = '[=11=]';
    URL(str, len);
}

输入:

Mr John Smith     

注意:Smith 后有 5 个额外空格

输出:

input: |Mr John Smith     |
output: |Mr%20John%20Smith%20%20%20%20%20|

除了使用 fgets 之外,正如@4386427 所建议的,您还可以将 scanf 与说明符 %[^\n] 一起使用(匹配任何不是 \n 的内容)阅读整行,像这样:

scanf(" %[^\n]", str);

为了安全起见,在处理字符串时,您应该始终限制可读取的字符数,使其不超过数组的长度 str,方法是:

scanf(" %99[^\n]", str);

所以你的 main 可能是:

int main()
{
    char str[100];
    int len;
    printf("Enter the string : ");
    scanf(" %99[^\n]", str);
    for (int c=getchar(); c!='\n' && c!=EOF; c=getchar());
    len = strlen(str);
    URL(str, len);
}