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



我正在执行一个将字符串中的所有空格替换为"%20"的方法。人们可以假设字符串末尾有足够的空间来容纳附加字符,并且给定字符串的"真实"长度。

例:

输入:"约翰·史密斯先生",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] = '';
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);

工作?

如果您的输入是:Mr John Smithstr将包含的内容

它没有按照你想的那样做!答案是它将包含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] = '';
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] = '';
URL(str, len);
}

输入:

Mr John Smith     

注意:史密斯之后有 5 个额外的空格

输出:

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

除了使用 @4386427 建议的fgets之外,您还可以将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);
}

相关内容

  • 没有找到相关文章

最新更新