在C中连接字符串和数字
Concatenating a string and numbers in C
我有一个程序必须计算字符串中重复字符的数量。例如“aaabcc”应该return“a3b1c2”和“aaabcccc..a”应该return“a3b1c4.2a1”。我目前正在使用 sprintf 像这样连接字符串和数字:sprintf(s, "%s%c%d", s, prev, count);
,其中 s 是包含结果的字符串。但这会导致错误,因为我使用“s”作为输入和目标。有解决办法吗?
这是我现在的代码:
char *s = (char *)malloc(sizeof(char) * 100);
char prev = argv[1][0];
if(isdigit(prev)!=0){
printf("%s","ERROR");
return 0;
}
int count = 1;
for(int i=1; i<strlen(argv[1]); i++){
if(isdigit(argv[1][i])!=0){
printf("%s","ERROR");
return 0;
}
//check if same as previous letter
if(prev==argv[1][i]){
count++;
}else{
//add letter and count to string
//problem
sprintf(s, "%s%c%d", s, prev, count);
count = 1;
}
//update prev
prev=argv[1][i];
}
//add it to string
//problem
sprintf(s, "%s%c%d", s, prev, count);
//check if result is smaller than input
if(strlen(s) > strlen(argv[1])){
printf("%s\n", argv[1]);
}else{
printf("%s\n", s);
}
free(s);
为 sprintf()
使用不同的缓冲区,然后使用 strcat()
连接到 s
。
确保在分配后将 s
初始化为空字符串。
不是为 s
分配硬编码大小,而是分配一个足够大的字符串以应对最坏的情况(每个字符只重复一次,所以它是 a1b1c1...
)。
temp
可以是一个固定大小的短字符串,因为它只需要保持一个 运行.
的长度
char *s = malloc(strlen(argv[1]) * 2 + 1);
s[0] = '[=10=]';
char temp[20];
char prev = argv[1][0];
if(isdigit(prev)!=0){
printf("%s","ERROR");
return 0;
}
int count = 1;
for(int i=1; i<strlen(argv[1]); i++){
if(isdigit(argv[1][i])!=0){
printf("%s","ERROR");
return 0;
}
//check if same as previous letter
if(prev==argv[1][i]){
count++;
}else{
//add letter and count to string
sprintf(temp, "%c%d", prev, count);
strcat(s, temp);
count = 1;
}
//update prev
prev=argv[1][i];
}
//add it to string
sprintf(temp, "%s%c%d", prev, count);
strcat(s, temp);
//check if result is smaller than input
if(strlen(s) > strlen(argv[1])){
printf("%s\n", argv[1]);
}else{
printf("%s\n", s);
}
free(s);
评论和其他答案中的建议为您提供了有关如何管理使用 malloc 动态分配的字符串的良好指导。但是您可以简化整个程序,而无需分配字符串,也无需使用 sprintf。
考虑一下:
int lastChar = '[=10=]';
int count = 0;
const char* arg = argv[1];
int isError = 0;
if (argc < 2) {
isError = 1;
}
while (*arg & !isError) { // scan argv[1] for digits
isError = isdigit(*arg);
arg++;
}
arg = argv[1]; // reset arg back to beginning of argv[1]
while (*arg && !isError) {
if (lastChar == *arg) {
count++;
}
else {
if (count > 0) {
printf("%c%d", lastChar, count);
}
lastChar = *arg;
count = 1;
}
arg++;
}
// print the last character being tracked or error message
if (isError) {
printf("ERROR");
}
else if (count > 0) {
printf("%c%d", lastChar, count);
}
printf("\n");
我有一个程序必须计算字符串中重复字符的数量。例如“aaabcc”应该return“a3b1c2”和“aaabcccc..a”应该return“a3b1c4.2a1”。我目前正在使用 sprintf 像这样连接字符串和数字:sprintf(s, "%s%c%d", s, prev, count);
,其中 s 是包含结果的字符串。但这会导致错误,因为我使用“s”作为输入和目标。有解决办法吗?
这是我现在的代码:
char *s = (char *)malloc(sizeof(char) * 100);
char prev = argv[1][0];
if(isdigit(prev)!=0){
printf("%s","ERROR");
return 0;
}
int count = 1;
for(int i=1; i<strlen(argv[1]); i++){
if(isdigit(argv[1][i])!=0){
printf("%s","ERROR");
return 0;
}
//check if same as previous letter
if(prev==argv[1][i]){
count++;
}else{
//add letter and count to string
//problem
sprintf(s, "%s%c%d", s, prev, count);
count = 1;
}
//update prev
prev=argv[1][i];
}
//add it to string
//problem
sprintf(s, "%s%c%d", s, prev, count);
//check if result is smaller than input
if(strlen(s) > strlen(argv[1])){
printf("%s\n", argv[1]);
}else{
printf("%s\n", s);
}
free(s);
为 sprintf()
使用不同的缓冲区,然后使用 strcat()
连接到 s
。
确保在分配后将 s
初始化为空字符串。
不是为 s
分配硬编码大小,而是分配一个足够大的字符串以应对最坏的情况(每个字符只重复一次,所以它是 a1b1c1...
)。
temp
可以是一个固定大小的短字符串,因为它只需要保持一个 运行.
char *s = malloc(strlen(argv[1]) * 2 + 1);
s[0] = '[=10=]';
char temp[20];
char prev = argv[1][0];
if(isdigit(prev)!=0){
printf("%s","ERROR");
return 0;
}
int count = 1;
for(int i=1; i<strlen(argv[1]); i++){
if(isdigit(argv[1][i])!=0){
printf("%s","ERROR");
return 0;
}
//check if same as previous letter
if(prev==argv[1][i]){
count++;
}else{
//add letter and count to string
sprintf(temp, "%c%d", prev, count);
strcat(s, temp);
count = 1;
}
//update prev
prev=argv[1][i];
}
//add it to string
sprintf(temp, "%s%c%d", prev, count);
strcat(s, temp);
//check if result is smaller than input
if(strlen(s) > strlen(argv[1])){
printf("%s\n", argv[1]);
}else{
printf("%s\n", s);
}
free(s);
评论和其他答案中的建议为您提供了有关如何管理使用 malloc 动态分配的字符串的良好指导。但是您可以简化整个程序,而无需分配字符串,也无需使用 sprintf。
考虑一下:
int lastChar = '[=10=]';
int count = 0;
const char* arg = argv[1];
int isError = 0;
if (argc < 2) {
isError = 1;
}
while (*arg & !isError) { // scan argv[1] for digits
isError = isdigit(*arg);
arg++;
}
arg = argv[1]; // reset arg back to beginning of argv[1]
while (*arg && !isError) {
if (lastChar == *arg) {
count++;
}
else {
if (count > 0) {
printf("%c%d", lastChar, count);
}
lastChar = *arg;
count = 1;
}
arg++;
}
// print the last character being tracked or error message
if (isError) {
printf("ERROR");
}
else if (count > 0) {
printf("%c%d", lastChar, count);
}
printf("\n");