提问人:Fadi EID 提问时间:8/21/2022 最后编辑:Fadi EID 更新时间:8/22/2022 访问量:99
如何使用 gets() 扫描具有未知大小和值的字符串以在 C 函数中使用?
How can I scan a string with unknown size and values to use inside a function in C using gets()?
问:
我正在尝试使用以下函数将数字从基数 b 转换为基数 10 base_b_to_10:
long int base_b_to_10(char* B, long int base) //take in the number as string returns it converted to base 10 as long int
{
long int N; //base 10 number:
N = strtol(B, NULL, base); //
return(N);
}
在主程序中,用户将输入输入编号的基数和输入编号本身。字符串的长度和大小是未知的,由用户来定义 这是我尝试构建的一个大程序的简化版本,其中字符串 B 的大小在另一个函数中动态分配,因此我不能做类似的事情:
char B[100];
如何解决这个问题?编译器不返回任何内容。
答:
输入字符串(此处:)可以是任何合理的大小。无论如何,可能存在一些限制,请参阅: Strtol() 和 atol() 不转换大于 9 位的
字符串 输出字符串是指向输入字符串 (here: ) 中位置的指针 (here: )。据此,指向的字符串的大小无关紧要。(注意:在本例中,仅有效)。test
*str
test
str
str
test
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long int base_b_to_10(char* B, long int base, char **ret_str)
{
long int N;
N = strtol(B, ret_str, base);
return N;
}
int main()
{
long int val;
char *str;
char test[50] = "43724325HelloWorld";
val = base_b_to_10(test, 10, &str);
printf("val = %ld\n", val);
printf("str = %s\n", str);
return 1;
}
笔记:我调整了你的例子只是为了工作(而不是改进或简化任何东西)。可能很明显,您也可以直接在主例程中使用函数。此外,输入字符串是如何分配的(固定大小或动态大小)并不重要 - 只需要分配并且需要以(像往常一样)结束。strtol
\0
如果跨平台不是问题,并且假设您在 linux 系统上运行,则可以使用 asprintf()。
它基本上格式化你的字符串并为你分配内存(记得之后释放它)。
这不是标准库的一部分,因此有其局限性。
- 另一种方法是使用 snprintf() 来预测输出缓冲区的大小,然后使用 malloc()
#include <stdio.h>
int main ()
{
int cx = snprintf ( NULL, 0, "18 characters long" );
printf("%d", cx);
return 0;
}
// OUTPUT:
// 18
好的,所以我解决了这个问题,首先使用大小为 50(足够了)的缓冲区字符串,然后我使用 strlen() 函数来确定用户给出的字符串的大小,最后我将这个数字分配给我将用于转换的字符串:
char *str, buffer[50];
printf("enter the input value: ");
gets(buffer);
int i;
i = strlen(buffer);
str = (char*)malloc(i*sizeof(char));
strcpy(str, buffer);
fflush(stdin);
N = base_b_to_10(str, base_in);
评论
gets(buffer);
gets()
上一个:文本文件转换为动态数组
下一个:将缓冲区传递给函数进行写入
评论
long int
long int