尝试修复 - 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);
}
我正在执行一种方法,用“%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);
}