如何使用 gets() 扫描具有未知大小和值的字符串以在 C 函数中使用?

How can I scan a string with unknown size and values to use inside a function in C using gets()?

提问人:Fadi EID 提问时间:8/21/2022 最后编辑:Fadi EID 更新时间:8/22/2022 访问量:99

问:

我正在尝试使用以下函数将数字从基数 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];

如何解决这个问题?编译器不返回任何内容。

C 字符串 动态 malloc

评论

0赞 Eric Postpischil 8/21/2022
“编译器不返回任何内容”本质上是没有意义的。如果你的意思是编译器完成编译而不报告错误,那么就这样说,并显示程序运行的示例——显示重现问题的输入的确切文本,显示观察到的输出的确切文本,并显示所需的输出。如果您另有意思,请显示编译器错误消息的文本或您观察到的任何其他内容。
0赞 Anthony L 8/21/2022
这个问题有帮助吗
0赞 Cheatah 8/21/2022
您无需假定字符串的长度为任意长度。如果字符串的长度超过某个特定大小,则它不能再放入 。无论如何,你都需要处理这个事实。long int
0赞 Eric Postpischil 8/21/2022
@Cheatah:任意长度的字符串可能表示适合 的值,因为它们可能以前导空格和前导零开头。long int
0赞 Fadi EID 8/21/2022
是的,他们的编译器完成编译没有错误,但我没有看到任何输出。

答:

-1赞 sidcoder 8/21/2022 #1

输入字符串(此处:)可以是任何合理的大小。无论如何,可能存在一些限制,请参阅: Strtol() 和 atol() 不转换大于 9 位的

字符串 输出字符串是指向输入字符串 (here: ) 中位置的指针 (here: )。据此,指向的字符串的大小无关紧要。(注意:在本例中,仅有效)。
test*strteststrstrtest

#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

-1赞 Sebastián Falcone 8/21/2022 #2
  • 如果跨平台不是问题,并且假设您在 linux 系统上运行,则可以使用 asprintf()。

    • 它基本上格式化你的字符串并为你分配内存(记得之后释放它)。

    • 这不是标准库的一部分,因此有其局限性。


  • 另一种方法是使用 snprintf() 来预测输出缓冲区的大小,然后使用 malloc()
#include <stdio.h>

int main ()
{
  int cx = snprintf ( NULL, 0, "18 characters long" );

  printf("%d", cx);

  return 0;
}

// OUTPUT:
// 18
-1赞 Fadi EID 8/22/2022 #3

好的,所以我解决了这个问题,首先使用大小为 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);

评论

0赞 user3629249 8/24/2022
regaarding:函数:已贬值多年,并在 2009 年左右从 C 语言中完全删除。如果您的编译器没有警告您此问题,那么强烈建议您获取现代 C 编译器。gets(buffer);gets()