在字符串中添加空终止符

时间:2014-12-12 19:23:54

标签: c

我使用sscanf扫描字符串并将其添加到结构中。唯一的问题是我无法打印出字符串,因为默认情况下没有添加空终止符。我尝试使用strcat()函数在那里添加一个null但是实现了这个无法工作。谢谢你的帮助。

struct a
{
int *ref;
char string[50];
}rec;

void task()
{


   char *p_test;

   char test[50] = "9999:STRING OF TEXT";
   p_test = test;

   sscanf(p_test, "%d:%[^\n]", &rec.ref, rec.string);

   printf("String is:%s", &rec.string);

}

2 个答案:

答案 0 :(得分:3)

您的代码存在多个问题。

  1. test[50] = "9999:STRING OF TEXT";
    
  2. 这有两个原因是错误的。

    A)testchar的数组,而不是char*的数组。因此,当您为元素分配字符串(char*)时,地址将转换为char

    B)数组中不存在元素50,写入它会调用未定义的行为。您有一组50元素,其索引为0...49

    要为数组指定初始值,您只需要:

    char test[50] = "9999:STRING OF TEXT";
    

    由于test不需要修改......

    const char *test = "9999:STRING OF TEXT";
    
    1. 如果要将数组归零,最简单的方法是:

      char test[50] = {0};
      
    2. 当然,如果您正确分配字符串,则不需要,这不是您的问题。

      1. string结构的a成员是char,而不是char*(字符串),并使用%s格式打印时的说明符调用未定义的行为。

      2. main定义为返回int,而不是void

      3. sscanf需要填写数据的指针。rec.refint,您需要传递其地址,即&rec.ref

      4. 您需要为rec.string分配存储空间。


      5. 这是一个有效的例子:

        #include <stdio.h>
        
        #define STRING_LEN 50
        
        struct a
        {
            int ref;
            char string[STRING_LEN];
        } rec;
        
        int main()
        {
            char test[STRING_LEN] = "9999:STRING OF TEXT";
        
            // note that, in the real world, this may 
            // be a buffer overflow waiting to happen
            sscanf(test, "%d:%[^\n]", &rec.ref, rec.string);
        
            printf("String is:%s, rec is:%d", rec.string, rec.ref);
            return 0;
        }
        

答案 1 :(得分:1)

你有很多问题;缺少null终结符实际上并不是其中之一。

一个问题是语法错误;这样:

   char test[50]
   test[50] = "9999:STRING OF TEXT";

是无效的语法。你需要:

   char test[50] = "9999:STRING OF TEXT";

另一个问题是rec没有字符串(char *char[]),它只有一个字符(char)。一个简单的方法,让你开始,是:

struct a
{
    int ref;
    char string[50];
} rec;

第三个问题是sscanf的参数都必须是指针。 C是一种按值传递的语言;如果你只传入一个整数,那就不会给sscanf任何方法来修改那个整数:

sscanf(test, "%d:%[\n]", &rec.ref, rec.string); // (once rec.string is a pointer)

第四个问题是格式说明符%[\n]并不代表您希望它的含义。 (也许你真的想要%[^\n]?)

其他较小的问题包括main的返回类型(应该是int,而不是void)。

大多数这些问题的共同点是,如果您只是打开编译器警告,您的编译器会急切地帮助您识别它们!